Docker-Compose の変数定義について

docker-compose.ymlで利用できる変数と、Dockerコンテナで利用できる変数の2種類がある。

検証環境

$ docker -v
Docker version 18.03.1-ce, build 9ee9f40
$ docker-compose -v
docker-compose version 1.21.2, build a133471

docker-compose.ymlで利用できる変数

環境変数

環境変数は、 docker-compose.yml で利用できる。この変数は、Dockerコンテナからは利用できない。

version: "3"
services:
  app:
    image: "alpine:latest"
    command:  sh -c "echo ${MESSAGE} ; env"
$ export MESSAGE=hello
$ docker-compose up
Recreating docker_app_1 ... done
Attaching to docker_app_1
app_1  | hello
app_1  | HOSTNAME=35c90b0c3f6b
app_1  | SHLVL=1
app_1  | HOME=/root
app_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app_1  | PWD=/
docker_app_1 exited with code 0

.envファイル

ディレクトリ直下に.envファイルを配置することで、docker-comopse.ymlで利用できる変数を定義できる。この変数は、Dockerコンテナからは利用できない

$ cat .env 
TAG=3.1
version: "3"
services:
  app:
    image: "alpine:${TAG}"
    command: sh -c "uname -a ; env"

docker-compse.ymlのタグが変わっていることがわかる。

$ docker-compose up
Starting docker_app_1 ... done
Attaching to docker_app_1
app_1  | Linux 3d167f31da9b 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 Linux
app_1  | HOSTNAME=3d167f31da9b
app_1  | HOME=/root
app_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app_1  | PWD=/
docker_app_1 exited with code 0

Dockerコンテナで利用できる変数

environment

docker-compose.ymlファイルにenvironmentを定義すると、Dockerコンテナで利用できる。

version: "3"
services:
  app:
    image: alpine:latest
    environment:
      - SAMPLE_USER=user
    command: env

実行すると、以下のようになる。

$ docker-compose up
Recreating docker_app_1 ... done
Attaching to docker_app_1
app_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app_1  | HOSTNAME=b5843a201fae
app_1  | SAMPLE_USER=user
app_1  | HOME=/root
docker_app_1 exited with code 0

また、docker-compose.ymlで利用可能な変数は、変数名だけを定義すればコンテナに引き継げる

version: "3"
services:
  app:
    image: alpine:latest
    environment:
      - SAMPLE_USER
    command: env
$ export SAMPLE_USER=admin
$ docker-compose up
Recreating docker_app_1 ... done
Attaching to docker_app_1
app_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app_1  | HOSTNAME=59ca518d8971
app_1  | SAMPLE_USER=admin
app_1  | HOME=/root

env_file

コンテナ内で利用できる環境変数を、外部ファイルから読み込める。この変数は、docker-compose.ymlからは利用できない。

$ cat app.env 
SAMPLE_APP_VERSION=1.0.0
version: "3"
services:
  app:
    image: "alpine:latest"
    env_file:
      - app.env
    command: env
$ docker-compose up
Recreating docker_app_1 ... done
Attaching to docker_app_1
app_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app_1  | HOSTNAME=6656d72f7508
app_1  | SAMPLE_APP_VERSION=1.0.0
app_1  | HOME=/root

docker-compose run -e XXX=YYY

コンテナ内で利用できる変数をdocker-composeの起動引数で設定できる。この変数は、docker-compose.ymlからは利用できない。

version: "3"
services:
  app:
    image: "alpine:latest"
    command: env
$ docker-compose run -e SAMPLE_APP_VERSION=1 app
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=6ca4fb8fa3f4
TERM=xterm
SAMPLE_APP_VERSION=1
HOME=/root

変数の優先順位

コンテナ内の変数の優先順位

リファレンスの通り。

  1. Compose file,
  2. Environment file,
  3. Dockerfile,
  4. Variable is not defined.

docker-compose.yml で参照するときの優先順位

環境変数 > .envファイル

version: "3"
services:
  app:
    container_name: ${NAME}
    image: "alpine:latest"
    command: env
$ cat .env 
NAME=hoge
$ export NAME=fuga
$ docker-compose up
Recreating hoge ... done
Attaching to fuga
fuga   | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
fuga   | HOSTNAME=68c4de49dd38
fuga   | HOME=/root
fuga exited with code 0

動的な値を利用したい

docker-compose.yml

docker-compose.ymlで動的な値を利用したければ、docker-compose を実行する前に、環境変数を設定すれば良い。

version: "3"
services:
  app:
    container_name: "app-${ID}"
    image: "alpine:latest"
    command: env
$ export ID=$(date  '+%Y%m%d')
$ docker-compose up
Creating app-20180311 ... 
Creating app-20180311 ... done
Attaching to app-20180311
app-20180311 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app-20180311 | HOSTNAME=10df3a31c3ff
app-20180311 | HOME=/root
app-20180311 exited with code 0

Dockerコンテナ

Dockerコンテナで動的な値を利用したければ、environmentで環境変数を指定しておき、

version: "3"
services:
  app:
    image: "alpine:latest"
    environment:
      - TIMESTAMP
    command: env

docker-compose 実行前に、環境変数を設定すれば良い。

$ export TIMESTAMP=$(date '+%Y%m%d')
$ docker-compose up
Recreating compose_app_1 ... 
Recreating compose_app_1 ... done
Attaching to compose_app_1
app_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app_1  | HOSTNAME=4f2282348e06
app_1  | TIMESTAMP=20180311
app_1  | HOME=/root

あるいは、env_fileで読み込むファイルをdocker-compose実行前に作成する。

version: "3"
services:
  app:
    image: "alpine:latest"
    env_file:
      - app.env
    command: env
$ cat > app.env  << FIN
TIMESTAMP=$(date '+%Y%m%d')
FIN
$ docker-compose up
Starting compose_app_1 ... 
Starting compose_app_1 ... done
Attaching to compose_app_1
app_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
app_1  | HOSTNAME=4f2282348e06
app_1  | TIMESTAMP=20180311
app_1  | HOME=/root
compose_app_1 exited with code 0

参考