docker compose overrideについて、概要と使用例を載せていく
リポジトリ:https://github.com/tkeshun/docker_compose_override
docker compose overrideとは
複数のcomposeファイルをマージして、1つのcomposeファイルを作る方法。
- 参考
環境固有のものや、dev・stagging・production(docker-composeをプロダクション環境で使うことはありえないが)など設定をわけることができる。
デフォルトではcompose.yml
、compose.override.yml
の2つに分けられる
マージは-f
オプションで行うことができる
マージ結果がみたいときは、docker compose -f ファイル名 -f ファイル名 config
でみれる。
マージしたcomposeファイルで起動したい場合はdocker compose -f ファイル名 -f ファイル名 up
でOK。
ちなみに3ファイル以上でもマージできる。あとに指定したファイルで上書きされていく。
以下に例を示す。
2つのファイルをマージする
- compose.yml(マージされるファイル)
$ cat compose.yml
services:
app:
image: my-app:latest
ports:
- "3000:3000"
- compose.override.yml(マージするファイル)
$ cat compose.override.yml
services:
app:
environment:
- NODE_ENV=development
volumes:
- ./src:/app/src
- マージ後(compose.ymlにcompose.override.ymlをマージする)
$ docker compose -f compose.yml -f compose.override.yml config
name: docker_compose_override
services:
app:
environment:
NODE_ENV: development
image: my-app:latest
networks:
default: null
ports:
- mode: ingress
target: 3000
published: "3000"
protocol: tcp
volumes:
- type: bind
source: /home/shun/workspace/docker_compose_override/src
target: /app/src
bind:
create_host_path: true
networks:
default:
name: docker_compose_override_default
※補足:書かれてないのに増えている項目は、マージによって生成されるものではなくデフォルト設定である。
通常は暗黙的に設定される項目が、configでyamlを出力するとみることができる。
そのため、以下のようにcompose.ymlだけ指定してconfigを出力してみると暗黙に設定される項目をみることができる。
$ docker compose -f compose.yml config
name: docker_compose_override
services:
app:
image: my-app:latest
networks:
default: null
ports:
- mode: ingress
target: 3000
published: "3000"
protocol: tcp
networks:
default:
name: docker_compose_override_default
networks
以下が暗黙的にされる項目。
マージルール
マージルールの一部を紹介
同じキーを指定すると上書きされる
$ cat value.yml
services:
app:
image: my-app:1.0
$ cat value.override.yml
services:
app:
image: my-app:2.0
$ docker compose -f value.yml -f value.override.yml config
name: example2
services:
app:
image: my-app:2.0
networks:
default: null
networks:
default:
name: example2_default
同じキーの中で違うキーを指定するとマージされる
$ cat onaji-key.yaml
services:
app:
image: my-app:1.0
environment:
NODE_ENV: production
$ cat onaji-key.override.yml
services:
app:
environment:
DEBUG: true
$ docker compose -f onaji-key.yaml -f onaji-key.override.yml config
name: example3
services:
app:
environment:
DEBUG: "true"
NODE_ENV: production
image: my-app:1.0
networks:
default: null
networks:
default:
name: example3_default
リストはマージされる
$ cat list.yml
services:
app:
image: my-app:1.0
environment:
- production
$ cat list.override.yml
services:
app:
environment:
- dev
$ docker compose -f list.yml -f list.override.yml config
name: example4
services:
app:
environment:
dev: null
production: null
image: my-app:1.0
networks:
default: null
networks:
default:
name: example4_default
あとのファイルでnullを指定すると値の削除ができる
$ cat compose.yml
services:
app:
image: my-app:1.0
environment:
- APP_ENV=production
- DEBUG=true
$ cat compose.override.yml
services:
app:
environment:
DEBUG: null
$ docker compose -f compose.yml -f compose.override.yml config
name: poc-docer-override
services:
app:
environment:
APP_ENV: production
image: my-app:1.0
networks:
default: null
networks:
default:
name: poc-docer-override_default
まとめ
composeファイルのオーバーライド、マージについてまとめた。
実用例でいうと、複数のDBを使う場合やバージョンによって初期化SQLなどが違う場合はイメージを固めておいて、compose..db.ymlなどにしてimageキーの値を上書きすると便利なのではないかと思う。
記事を見た人は是非活用してほしい。