Compose: 環境変数はコンテナビルドには適用されません

作成日 2015年08月10日  ·  16コメント  ·  ソース: docker/compose

コンテナを構築する場合、環境変数は適用されません。

docker-compose.yml:

img:
    build: img
    environment:
        VAR: Hello

/ img / Dockerfile:

FROM python:2.7
RUN python -c 'import os; print os.environ["VAR"]'

「Hello」が書き込まれると予想され、 KeyError: VAR受け取りました-環境変数がありません。

(最後の失敗した行を削除した後) docker-compose run --rm img bashコンテナーに入り、 python -c 'import os; print os.environ["VAR"]'実行すると、期待される結果が得られます。

docker-compose==1.3.3

docker-version

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
kinquestion

最も参考になるコメント

このスタックオーバーフローの質問への回答は、 https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfileに役立ちました

ビルド中にDockerfileが使用するARGSに.env環境変数をマップすることができます。

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

全てのコメント16件

これは予想されます。 environment:でキーdocker-compose.ymlそれを指定するのと同じですdocker runコンテナを起動するコマンド。 builddockerfileは、イメージの構築に使用される古いキーです。

これはドキュメントからは明らかではない可能性があり、改善される可能性があります。

Dockerはビルド環境への環境の注入をサポートしていません(Dockerfileの一部である必要があります)が、そのようなもののサポートを追加するためのいくつかのオープンな提案があると思います。

この問題を見つけた人のための単なるリファレンスです。ビルド時の変数に関するDockerのディスカッションは次のとおりです: httpshttps

これは私たちを苦労させました、本当により良いドキュメントが必要です。

ドキュメントは本当に紛らわしいです。たとえば、 docker-compose.yml使用され、 docker run使用されるenv-fileについて説明しています。 docker-composeがコンテナーをビルドおよび実行するためのオーケストレーションツールであることを考えると、 --env <key>=<value>などを使用して、ビルド時間に環境が適用されることは容易に想像できます。

私も噛みました。
環境変数は、作成ファイルでビルド引数として設定できることに注意してください。 このスレッドの他の人と同じように、私は当初、env_fileまたはenvironmentがビルドと実行の両方で使用されることを期待していました。
作成ファイルv2、docker-compose v1.7、docker-enginev1.11で検証済み。

https://github.com/docker/compose/pull/3747のドキュメントを更新しました

ファイルからenv変数を含める必要がある場合は、次のことができることに注意してください。 これには、(docker-composeビルドセクションで)これらの変数から設定された引数が必要になります。これらの引数は、dockerファイルで参照できます。 つまり、env_fileを直接再利用することはできませんが、少し余分な作業を行うだけで再利用できます。

env $(cat vars.env | xargs) docker-compose up --build <whatever>

このスタックオーバーフローの質問への回答は、 https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfileに役立ちました

ビルド中にDockerfileが使用するARGSに.env環境変数をマップすることができます。

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

@williamli Stack Overflowの質問へのリンクを追加できますか?

申し訳ありませんが、これを解決する方法がわかりません。ビルド済みのイメージを使用したいと思います。

たとえば、私の作成ファイルは次のとおりです。

バージョン:「3」

サービス:
web1:
画像:softwaremaker / web-w
環境:

  • wtmsdemo_customerapi01 = http:// api1 / api / values
    ポート:
  • 「89:80」
    depends_on:
  • api1
    api:
    画像:softwaremaker / api-w
    ネットワーク:
    デフォルト:
    外部:

名前:nat

以前は、APIイメージ(softwaremaker / api-w)は、上記で設定した環境変数に解決できると思っていましたが、機能しません。

@PatrLind
元のコメントにstackoverflowリンクを追加しました。

https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

この問題は、デフォルトの.envファイル以外のenvファイルにも関連しています。
Fe次のコードは機能しません:

  nginx:
    env_file:
      - .env
      - .env.local
    environment:
     - SERVER_NAME=${SERVER_NAME}
    build:
      context: ./nginx
      dockerfile: Dockerfile
      args:
        server_name: ${SERVER_NAME}

一方、SERVER_NAMEは2番目のenvファイル( .env.local )で定義されています。
.env.localからenv変数を渡してコンテキストを構築するオプションがありません((

@remort
これも確認できます。ビルド中に使用されている変数がある場合、ファイルの名前が.env場合にのみビルドプロセスに渡され、名前が.env.docker場合は取得されません。拾った。 .env.dockerファイルを使用するようにenv_fileが指定されている場合でも。

ビルド中のこれに対する私の解決策は、他の名前付きenvファイルをコピーし、名前を.envに変更します

COPY .env.docker ${APP_HOME}/.env
WORKDIR $APP_HOME

この後、コンテナの実行時に環境変数を取得するように見えました

オペレーティングシステム: macOS(10.14.6)
Dockerデスクトップバージョン: 2.1.0.5(40693)
エンジンバージョン: 19.03.5
構成: 1.24.1

こんにちは、みんな、

皆さんへの簡単な質問ですが、これは開発者向けのイメージを構築するためのより良い方法でしょうか? これまでのところ正常に動作します。 ただし、これは推奨される方法ですか? すべての画像はバスターに基づいています。

`` `
FROM redis:redisとしてのバスター
実行mkdir / env && env> /env/.env_redis
cat / etc / passwdを実行します
実行ls-lah / home
FROM ruby​​:slim-buster AS ruby
実行mkdir / env && env> /env/.env_ruby

FROMノード:lts-buster-slimASノード
実行mkdir / env && env> /env/.env_node

nginxをビルドする

FROM nginx:latest AS nginx
実行mkdir / env && env> /env/.env_nginx

PHPをビルドする

FROM php:fpm-buster AS php

FROM php:7.3.14-fpm-buster AS php

mkdir / env && env> /env/.env_phpを実行します
COPY --from = redis / /
COPY --from = ruby​​ / /
COPY --from = node / /
COPY --from = nginx / /

conf / include-site.conf / etc / nginx / conf.d / include-site.confを追加します
conf /supervisord.confを追加します/etc/supervisord.conf

surootを実行します
EXPOSE 80 443
WORKDIR "/ var / www / html"

ENTRYPOINT ["/ bin / bash"、 "/start.sh"]

問題はまだ存在します。
ビルドセクションのenv_fileキーは、env変数を引数を介してコンテナビルドに渡すよりも明確になります。
このような:

#NOT_WORKING
build:
      context: ./client
      dockerfile: Dockerfile
      env_file: ${CURRENT_ENV_FILE}

シェルスクリプトを使用してdockercomposeをビルドおよびアップしているためです。
本番環境では、dev / localとは異なるenv_fileが必要です。
そして、多くの引数を持つ多くのdocker-compose.env.ymlファイルがあるので、私が思うほど便利ではありません

これを回避するためのエレガントな方法が必要だと思います。 私はdocker構文が本当に好きで、環境変数の代わりに引数を使用することは私には意味がありません。 docker-composeファイルを誰かに手動で変更してほしくない。 .envファイルの値を変更することは私には一貫しているように見えます。

このページは役に立ちましたか?
0 / 5 - 0 評価