WebLog

docker-compose.yamlはマージできる

2022/10/22 09:54

docker compose のデフォルトの挙動

デフォルトでは、docker-compose.yaml をベースとして読み込み、docker-compose.override.yaml があればそれで上書きします。

1# docker-compose.yamlをベースに起動
2# docker-compose.override.yamlがあればそれで上書きしたもので起動
3docker compose up

デフォルトでは、 Compose は2つのファイルを読み込みます。1つは docker-compose.yml で、もう1つはオプションで docker-compose.override.yml ファイルです。習慣として、 docker-compose.yml に基本となる設定を入れます。 上書き override ファイルは、その名前が意味する通り、既存のサービスや新しいサービス全体の設定を上書きする設定を含められます。

:::details デフォルトで読み込む docker-compose.yaml の変更 以下の記事が詳しいです。 https://qiita.com/hoto17296/items/a8a85d5244f46c119278 :::

docker compose の-f オプション

それに対して、docker compose コマンドを実行するときに-f オプションで設定ファイルを指定できます。

1docker compose -f docker-compose.yaml up # 本番環境用の設定ファイルで起動
2docker compose -f docker-compose.dev.yaml up # dev環境用の設定ファイルで起動
3docker compose -f docker-compose.test.yaml up # test環境用の設定ファイルで起動

のようにすることで環境ごとに設定ファイルを分けることができます。

:::details docker-compose コマンドと docker compose コマンドについて 以下の記事が参考になります。基本的にはあまり変わらないみたいです。 https://qiita.com/kotobuki5991/items/e2af78c11b4571f904e5 :::

-f オプションを複数指定するとマージできる

ここで、-f オプションを複数指定するとそれらを全てマージしたものを設定ファイルとしてコンテナ群を起動することができます。

1# 本番環境とdev環境の設定ファイルをマージして起動
2docker compose -f docker-compose.yaml -f docker-compose.dev.yaml up

マージの仕様について

-f オプションに複数指定する場合は、以下のような点がポイントです。

  • 1 つ目の-f オプションに指定する設定ファイルは docker-compose.yaml ファイルとして正しいものでなければいけない
  • 逆に2 つ目以降は正しくなくていい(docker-compose.yaml の破片でいい)
  • あとに指定した設定ファイルが優先される

複数の上書きファイルを使う場合や、異なる名前の上書きファイルを使う場合は、 -f オプションを使ってリストやファイルを指定できます。コマンドライン上で指定した順番で、Compose はそれらのファイルを統合します。 -f を使う詳しい情報は docker-compose コマンドリファレンス をご覧ください。

複数の設定ファイルを使う場合、全ファイルのパスが基本となる Compose ファイル( -f で1番目に指定した Comopse ファイル)からの相対パスになるので、注意が必要です。注意が要るのは、上書きするファイルは正しい Comopse ファイルである必要がないためです。サービスの一部を追跡するにあたり、相対パスは複雑で混乱するため、パスを分かりやすくするためには、全てのパスを基本ファイルからの相対パスとして指定すべきです。

Compose 設定をファイルとプロジェクト間で共有 — Docker-docs-ja 24.0 ドキュメント

Compose 設定をファイルとプロジェクト間で共有 — Docker-docs-ja 24.0 ドキュメント

実際の使用例

docker-compose.yaml
1# ベースとなる内容を書く
2version: '3'
3services:
4 web:
5 image: node:16
docker-compose.dev.yaml
1# ベースからの変更点だけ書く
2services:
3 web:
4 tty: true

みたいにすると以下のような挙動になるはずです。

1# 起動後すぐ終了する
2docker compose -f docker-compose.yaml up
3
4# 起動したまま
5docker compose -f docker-compose.yaml -f docker-compose.dev.yaml up
6
7# 単体では実行できない
8docker compose -f docker-compose.dev.yaml up

終わりに

最近知った機能だったのでまとめてみました。

上書きできるところまでは知っていたのですが、2 つ目以降の docker-compose.yaml ファイルは一部のみの記述でいいことは結構イケてると思いました。これを使うと、ベースを 1 つ用意して、他環境は差分のみ書けばいいのでファイルを見た時にわかりやすいです。

参考

Compose 設定をファイルとプロジェクト間で共有 — Docker-docs-ja 24.0 ドキュメント

Compose 設定をファイルとプロジェクト間で共有 — Docker-docs-ja 24.0 ドキュメント

最新の投稿