SIerだけど技術やりたいブログ

6年目のSIerのブログです

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

検証したバージョン

$ docker -v
Docker version 17.06.1-ce, build 874a737
$ docker-compose -v
docker-compose version 1.16.1, build 6d1ac21

ファイル内の変数の扱い

環境変数は、docker-compose.yml内で参照できる。

version: "3"
services:
  app:
    image: "alpine:latest"
    command: echo ${MESSAGE}
$ export MESSAGE=hello
$ docker-compose up
Recreating compose_app_1 ... 
Recreating compose_app_1 ... done
Attaching to compose_app_1
app_1  | hello
compose_app_1 exited with code 0

変数の定義方法

.envファイル

docker-compose.yml 内で利用できる環境変数を定義する。
コンテナ内からは利用できない。

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

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

$ docker-compose up
Pulling app (alpine:3.1)...
3.1: Pulling from library/alpine
61aa778aed31: Pull complete
Digest: sha256:10de714727daa45047abdfb81c98dbf45e1cad3b590b5043d0da139bfeacebe5
Status: Downloaded newer image for alpine:3.1
Recreating compose_app_1 ... 
Recreating compose_app_1 ... done
Attaching to compose_app_1
app_1  | Linux 33b473091f0e 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 Linux
compose_app_1 exited with code 0

environment

コンテナ内で利用できる環境変数を定義する。
docker-compose.ymlからは利用できない。

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

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

$ 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=c0334b1fb759
app_1  | SAMPLE_USER=user
app_1  | HOME=/root
compose_app_1 exited with code 0

また、docker-compose.yml内で参照可能な変数は、そのままコンテナ内に引き継げる。

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

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 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=f18e8de13de7
app_1  | SAMPLE_APP_VERSION=1.0.0
app_1  | HOME=/root
compose_app_1 exited with code 0

docker-compose run -e XXX=YYY

コンテナ内で利用できる環境変数を定義する。
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=ddcc17d12cb3
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
 Starting fuga ... 
 Starting fuga ... done
 Attaching to fuga
 fuga   | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 fuga   | HOSTNAME=fe68b57dfc2c
 fuga   | HOME=/root
 fuga exited with code 0

動的な値をどう設定するか?

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

コンテナ内

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

これを利用してコンテナ内にgitのコミットハッシュやブランチ名を入れておけば、アプリのリビジョンがわかるようになる。