理系学生日記

おまえはいつまで学生気分なのか

docker-compose.yaml において環境依存情報をどう扱うか

Docker Compose で環境依存情報を管理するにはどうすれば良いかってところですが、これは

  1. 環境共通の docker-compose.yaml を作る
  2. 環境依存の情報のみを記載した同様の YAML を作る
  3. これを組み合わせる

という手順とするのがベストプラクティスだと思います。簡単に説明します。

環境共通の docker-compose.yaml

何の意味もありませんが、サンプルとしてこのような docker-compose.yaml を書いてみます。

version: '3'

services:
  web:
    image: nginx:latest
    networks:
      - nw
  db:
    image: postgres:latest
    networks:
      - nw
networks:
  nw:
    driver: bridge

環境依存情報のみを既述した YAML ファイル

開発環境用の設定情報を記載した以下のようなファイル docker-compose.dev.yaml を用意します。

version: '3'

services:
  web:
    environment:
      DEBUG: 'true'
  db:
    environment:
      POSTGRES_PASSWORD: dev-passwd

マージする

あとはこの 2 つの YAML ファイルをマージすれば良い。これは、docker-compose コマンドに -f を複数指定すれば、docker-compose が勝手にやってくれます。 順番が重要で、最初の -f で指定するのがベースとなる docker-compose ファイルになります。その後に指定する docker-compose ファイルは、別に valid でなくても良い。 ただし、version だけは合わせないと、エラーになります。

実際に試してみると、以下のように、開発環境の設定で container が立ち上がっていることが分かります。

$ docker-compose -f docker-compose.yaml \
                 -f docker-compose.dev.yaml 
                 -d up
# db で環境変数を出力
$ ddocker-compose -f docker-compose.yaml -f docker-compose.dev.yaml exec db env | grep POSTGRES_PASSWORD
POSTGRES_PASSWORD=dev-passwd

もう少し厳密に差分を確認した結果が以下。環境依存の情報が適切にマージした docker-compose ファイルが生成されていることが分かります。

$ diff -u <(docker-compose -f docker-compose.yaml config) \
          <(docker-compose -f docker-compose.yaml -f docker-compose.dev.yaml config)
--- /dev/fd/11  2018-06-09 11:45:10.000000000 +0900
+++ /dev/fd/12  2018-06-09 11:45:10.000000000 +0900
@@ -3,10 +3,14 @@
     driver: bridge
 services:
   db:
+    environment:
+      POSTGRES_PASSWORD: dev-passwd
     image: postgres:latest
     networks:
       nw: null
   web:
+    environment:
+      DEBUG: "true"
     image: nginx:latest
     networks:
       nw: null