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コンテナからは利用できない。
docker-compose.yml
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
docker-compose.yml
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コンテナで利用できる。
docker-compose.yml
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で利用可能な変数は、変数名だけを定義すればコンテナに引き継げる。
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
docker-compose.yml
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ファイル
docker-compose.yml
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 を実行する前に、環境変数を設定すれば良い。
docker-compose.yml
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で環境変数を指定しておき、
docker-compose.yml
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実行前に作成する。
docker-compose.yml
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