プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2023/08/25

YAML のアンカー/エイリアスと docker compose の profiles を使って docker-compose.yml を作成する

event_note2023/08/25 8:51

github などで公開されている docker-compose.yml を見ていると、見慣れない表記を見かけることがあり、調べてみると YAML のアンカー/エイリアス機能であることがわかりました。

これと、docker compose の --profiles を組み合わせて、docker-compose.yml 一つで様々な環境で動かすことができるようにしているのを見るととても便利だなと思ったので、メモしておきます。

yaml のアンカーとエイリアス

yaml 自体の標準機能です。
これを使うことで、記述内容を共通化して DRY にできます。

  • アンカー: & を付けることで、他の場所でも参照できるようにします。
  • エイリアス: * を付けて、アンカーで定義した内容を参照します。

サンプル1

aaa: &hoge
  bbb: 1111
  ccc: 2222
ddd: *hoge

上記の場合、以下の様に展開されます。

aaa:
  bbb: 1111
  ccc: 2222
ddd:
  bbb: 1111
  ccc: 2222

サンプル2

アンカー内にアンカーがあっても問題ありません。

aaa: &hoge
  bbb: 1111
  ccc: &piyo 2222
ddd: *hoge
eee: *piyo

上記の場合、以下の様に展開されます。

aaa:
  bbb: 1111
  ccc: 2222
ddd:
  bbb: 1111
  ccc: 2222
eee: 2222

マージ

<<: と記述することで、アンカーで定義した内容をそのまま入れ込むことができます。

aaa: &hoge
  bbb: 1111
  ccc: 2222
ddd:
  <<: *hoge
  eee: 3333

上記の場合、以下の様に展開されます。

aaa:
  bbb: 1111
  ccc: 2222
ddd:
  bbb: 1111
  ccc: 2222
  eee: 3333

アンカーの上書き

アンカー名と同じキーが後にあった場合、上書きされます。

aaa: &hoge
  bbb: 1111
  ccc: 2222
  ddd: 3333
eee:
  <<: *hoge
  bbb: 4444
fff:
  <<: *hoge
  ddd: 5555

上記は以下のように展開されます。

aaa:
  bbb: 1111
  ccc: 2222
  ddd: 3333
eee:
  bbb: 4444
  ccc: 2222
  ddd: 3333
fff:
  bbb: 1111
  ccc: 2222
  ddd: 5555

これを使って、内容の大部分を共通化しつつ一部分だけは変えたいということができます。

docker-compose.yml で使用する場合

docker-compose.yml 内で共通の設定を括りだそうと以下の様に書くとエラーになります。

common: &common
  image: hoge
service:
  app:
    <<: *common

docker compose によって common 自体が解釈されるためです。
この場合、プレフィックスとして x- を付けると、docker compose からは無視されるようになります。

x-common: &common
  image: hoge
service:
  app:
    <<: *x-common

docker compose の profile

docker-compose.yml で定義されたサービスに profiles を定義することで、サービスのグループ分けやタグ付けのようなことができます。
以下が公式ドキュメントによる説明です。

profiles で指定したサービスのみを起動させることができるようになります。

上記を踏まえた実用的なサンプル

上記を踏まえると、yaml のアンカー/エイリアスにより記述内容を共通化しつつ、profile によって起動するコンテナを切り替えることができます。

尚、今回の記事を書くことになった動機が、以下の Stable Diffusion 用の docker-compose.yml を見たときで、どういう意味なんだろうと思ったのがきっかけです。

GPU を使う場合と、CPU を使う場合とで上手く共通化されており、また記述量も少なくサンプルとして丁度いいので、こちらをサンプルとして挙げさせていただきます。

docker-compose.yml の確認

ちなみに、docker compose によってどのように yaml ファイルが読み込まれるか確認するには、config オプションを使用します。

$ docker compose config