Posted at

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

More than 1 year has passed since last update.

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


変数の優先順位


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

リファレンスの通り。



  1. Compose file,

  2. Environment file,

  3. Dockerfile,

  4. 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


参考