docker-composeのENVはbuild時に適用されない

まとめ

  1. DockerfileのENVはbuild時もコンテナ起動時も適用される。
  2. 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.