docker-compose.ymlで管理するサービスのイメージを自分でビルドするときに、Dockerfileへ変数を渡すのに苦労したのでメモしておきます。
ymlを書き換えるのではなくて、.envを書き換えるだけで済むようにしたかったのです。
コマンド入力するときにオプションで渡すのも面倒だったし…
最終的に、以下のようにしたらできました。
- .envファイルに変数名=値 の形式で列挙
- さらに、args に変数を列挙して、Dockerfileに変数を届ける
- Dockerfile側で、ARGS で変数の利用を宣言する
動作テストのため、以下のdocker-compose.ymlとDockerfikeを作成しました。
まずはdocker-compose.ymlから。
version: "3.9"
services:
env_test:
container_name: "env_test"
build:
context: "./build"
dockerfile: "Dockerfile"
args: # .env で宣言している変数を、イメージビルド時に使えるようにします
- ENV_FROM_COMPOSE=$ENV_FROM_COMPOSE
つづいて、Dockerfileです。
FROM alpine:latest
ARG ENV_FROM_COMPOSE
RUN echo "env value: ${ENV_FROM_COMPOSE}"
CMD ["/bin/bash"]
.envには変数を設定。
ENV_FROM_COMPOSE=hello_from_docker-image-building!!
ビルドしてみます。
$ docker-compose build
Building env_test
[+] Building 0.5s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 0.0s
=> CACHED [1/2] FROM docker.io/library/alpine:latest 0.0s
=> [2/2] RUN echo "env value: hello_from_docker-image-building!!" 0.3s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:fc3c6c7aff6c5670a461dd324a2c81b2029389e5e1f0145110e6b50dbbd1b956 0.0s
=> => naming to docker.io/library/docker-env-test_env_test
ステージ [2/2]で、データが$ENV_FROM_COMPOSE が展開されて、値が表示されています。
ビルドステージでechoしても、こちらには表示されませんけど…
ビルド時にdocker-composeから値を渡したいときは、この記述方法が使えそうです。
注意点:docker-compose.yml のenv_fileは動作が違う!
2021.08.12 追記です。
docker-compose.ymlには、「env_file」という要素もあります。
これは、docker-compose 経由で立ち上げられたコンテナの中で利用できる環境変数を、外部ファイルに列挙しておくためのものです。
ここでファイルを指定しても、docker-compose.ymlの中で利用することはできません。
たとえば、「.another_env」というファイルを作って環境変数を列挙しておき、docker-compose.ymlにenv_fileで指定しても、.another_envに書かれた変数はdocker-compose.ymlからは利用できませんが、ビルドしたコンテナ内では利用できます。
version: "3.9"
services:
env_test:
container_name: "env_test"
env_file:
# .another_envに記載された変数は、docker-compose.ymlの中では利用できない!!
- ./.another_env
build:
context: "./build"
dockerfile: "Dockerfile"
.env 以外のファイルを読み込んでdocker-compose.yml内で利用する方法は、ちょっと調べただけではわかりませんでした。後日、また調査しておきます。。。
以上です。あなたのお役に立てればうれしいです。
最近のコメント