🌊

Docker Compose の YAML ファイルをマージ/オーバーライドする

2025/02/18に公開

TLDR

  • 次のコマンドで複数の compose.yaml ファイルをマージ/オーバーライドして起動

    docker compose -f compose.yaml -f compose.override.yaml up -d
    
  • マージされた内容は docker compose config コマンドで確認

    docker compose -f compose.yaml -f compose.override.yaml config
    
  • compose.override.yaml で設定を削除する場合、YAML の !reset タグを使う

    例:

    services:
      web:
        ports: !reset []
    
  • compose.override.yaml で設定を上書きする場合、YAML の !override タグを使う

    例:

    services:
      web:
        ports: !override
          - "18080:80"
    

概要

Docker Compose で複数の compose.yaml
ファイルをマージ/オーバーライドする方法について説明します。

docker compose コマンドの -f/--file オプションを使う

docker compose コマンドには -f/--file オプションがあり、複数の
compose.yaml ファイルを指定できます。

docker compose -f compose.yaml -f compose.override.yaml up -d

このコマンドの場合、 compose.yamlcompose.override.yaml
の内容がマージされた内容でコンテナが起動されます。

開発/本番環境切り替えや、既存の compose.yaml
に新しい設定を追加する際に便利です。

マージされた内容は docker compose config コマンドで確認できます。

docker compose -f compose.yaml -f compose.override.yaml config

設定の削除

上記の compose.override.yaml で設定を削除する場合、YAML の !reset
タグを使うことで削除できます。

compose.yaml

services:
  web:
    image: nginx
    ports:
      - "8080:80"

compose.override.yaml

services:
  web:
    ports: !reset []

この場合、 compose.override.yamlports の設定を削除しています。

設定の上書き

上記の compose.override.yaml で設定を上書きする場合、 YAML の !override
タグを使うことで上書きできます。

compose.yaml

services:
  web:
    image: nginx
    ports:
      - "8080:80"

compose.override.yaml

services:
  web:
    ports: !override
      - "18080:80"

!override タグを付与しないと、 ports
の設定がマージされてしまい、次のような内容になってしまいます。

services:
  web:
    image: nginx
    ports:
      - "8080:80"
      - "18080:80"

!override タグを付与することで、 ports の設定が上書きされます。

参考

https://docs.docker.com/compose/how-tos/multiple-compose-files/merge/

https://docs.docker.com/reference/compose-file/merge/

Discussion