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
変数の優先順位
コンテナ内の変数の優先順位
リファレンスの通り。
- Compose file,
- Environment file,
- Dockerfile,
- 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