コンテナを構築する場合、環境変数は適用されません。
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
これは予想されます。 environment:
でキーdocker-compose.yml
それを指定するのと同じですdocker run
コンテナを起動するコマンド。 build
とdockerfile
は、イメージの構築に使用される古いキーです。
これはドキュメントからは明らかではない可能性があり、改善される可能性があります。
Dockerはビルド環境への環境の注入をサポートしていません(Dockerfileの一部である必要があります)が、そのようなもののサポートを追加するためのいくつかのオープンな提案があると思います。
これは私たちを苦労させました、本当により良いドキュメントが必要です。
ドキュメントは本当に紛らわしいです。たとえば、 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
環境:
以前は、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
FROM nginx:latest AS nginx
実行mkdir / env && env> /env/.env_nginx
FROM php: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ファイルの値を変更することは私には一貫しているように見えます。
最も参考になるコメント
このスタックオーバーフローの質問への回答は、 https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfileに役立ちました
ビルド中にDockerfileが使用するARGSに.env環境変数をマップすることができます。
docker-compose.yml
Dockerfile