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