tatsumiyamamoto.com

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

2022-10-22

# docker compose のデフォルトの挙動

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

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

以下の記事が詳しいです。

Docker Compose の設定は上書きできる - Qiita
知っておくとちょっと便利な Docker Compose の Tips。Docker Compose の設定は上書きできるdocker compose コマンドの実行時に -f (もしくは --…
Docker Compose の設定は上書きできる - Qiita favicon https://qiita.com/hoto17296/items/a8a85d5244f46c119278
Docker Compose の設定は上書きできる - Qiita

# docker compose の-f オプション

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

fオプションで設定ファイルを指定できる
docker compose -f docker-compose.yaml up      # 本番環境用の設定ファイルで起動
docker compose -f docker-compose.dev.yaml up  # dev環境用の設定ファイルで起動
docker compose -f docker-compose.test.yaml up # test環境用の設定ファイルで起動

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

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

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

fオプションを複数指定するとマージできる
# 本番環境とdev環境の設定ファイルをマージして起動
docker 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 ドキュメント favicon https://docs.docker.jp/compose/extends.html

# 実際の使用例

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

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

テスト
# 起動後すぐ終了する
docker compose -f docker-compose.yaml up

# 起動したまま
docker compose -f docker-compose.yaml -f docker-compose.dev.yaml up

# 単体では実行できない
docker compose -f docker-compose.dev.yaml up

# 終わりに

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

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

# 参考

Compose 設定をファイルとプロジェクト間で共有 — Docker-docs-ja 24.0 ドキュメント
Compose 設定をファイルとプロジェクト間で共有 — Docker-docs-ja 24.0 ドキュメント favicon https://docs.docker.jp/compose/extends.html
Docker Compose の設定は上書きできる - Qiita
知っておくとちょっと便利な Docker Compose の Tips。Docker Compose の設定は上書きできるdocker compose コマンドの実行時に -f (もしくは --…
Docker Compose の設定は上書きできる - Qiita favicon https://qiita.com/hoto17296/items/a8a85d5244f46c119278
Docker Compose の設定は上書きできる - Qiita
docker composeとdocker-compose、ハイフン有無で何が違うのか? - Qiita
概要個人での開発や、学習のための環境構築には「docker compose」コマンドを使用していましたが、実務でのdocker環境構築手順では「docker-compose」コマンドが使用されてい…
docker composeとdocker-compose、ハイフン有無で何が違うのか? - Qiita favicon https://qiita.com/kotobuki5991/items/e2af78c11b4571f904e5
docker composeとdocker-compose、ハイフン有無で何が違うのか? - Qiita