docker-composeのENVはbuild時に適用されない
まとめ
- DockerfileのENVはbuild時もコンテナ起動時も適用される。
- docker-compse.yamlのENVはbuild時に適用されず、コンテナ起動時にDockerコンテナ内に展開される。
環境
$docker --version Docker version 19.03.8, build afacb8b
検証
Dockerfile
FROM node:alpine ARG ARG1=args_default_value_defined_dockefile ENV ENV1 $ARG1 ENV ENV2 "ENV2" ENV ENV3 "" RUN echo $ENV1 RUN echo $ENV2 RUN echo $ENV3 RUN echo $ENV4 RUN echo $ENV5 RUN printenv
1の検証
ENVはbuild時に適用される
$docker build -t test --no-cache . Step 11/11 : RUN printenv ... ENV1=args_default_value_defined_dockefile ENV2=ENV2 ENV3= ...
ENVはコンテナ起動時に適用される
$docker run -it --rm test ash / # printenv ... ENV1=args_default_value_defined_dockefile ENV2=ENV2 ENV3= ...
2の検証
Dockerfileは1と同様
docker-compose.yaml
version: "3" services: test: build: context: . args: ARG1: "arg_defined_docker-compose.yaml" environment: # docker-compse upのときcontainerに展開される - ENV3=ENV3 - ENV4=$ENV4 # 実行環境で定義された環境変数を読み込む - ENV5=ENV5 tty: yes
ENVはbuild時に適用されない
$docker-compose build --no-cache Step 11/11 : RUN printenv ... ENV1=arg_defined_docker-compose.yaml ENV2=ENV2 ENV3= ...
ENVはコンテナ起動時に展開される
$docker-compose build --no-cache $docker-compose up -d $docker-compose exec test ash -c "printenv" ... ENV1=arg_defined_docker-compose.yaml ENV2=ENV2 ENV3=ENV3 ENV4=hoge ENV5=ENV5 ...
参考
https://docs.docker.com/engine/reference/builder/#env
The ENV instruction sets the environment variable
to the value . This value will be in the environment for all subsequent instructions in the build stage and can be replaced inline in many as well.
https://docs.docker.com/compose/compose-file/#environment
If your service specifies a build option, variables defined in environment are not automatically visible during the build. Use the args sub-option of build to define build-time environment variables.