Docker Compose V2で変わったdocker-compose.ymlの書き方
概要
2021年の後半にDocker Compose V2
がリリースされました
Docker Compose V2
はCompose Spec[1]に準拠しているため、docker-compose.yml
もその仕様に則った書き方ができるようになっています
services:
app1:
image: awesome/webapp
configs:
- my_config
secrets:
- server-certificate
app2:
image: awesome/database
extends:
service: app1
configs:
my_config:
file: ./my_config.txt
secrets:
server-certificate:
file: ./server.cert
展開後のyaml
services:
app1:
configs:
- source: my_config
image: awesome/webapp
networks:
default: null
secrets:
- source: server-certificate
app2:
configs:
- source: my_config
extends:
service: app1
image: awesome/database
networks:
default: null
secrets:
- source: server-certificate
networks:
default:
name: sample_default
secrets:
server-certificate:
name: sample_server-certificate
file: /home/nkagami/repository/sample/server.cert
configs:
my_config:
name: sample_my_config
file: /home/nkagami/repository/sample/my_config.txt
前提
Docker Compose V2 とは
Compose Specificationに準拠した新しいdocker compose
コマンドです
大雑把に以下のような違いがあります
v1 | v2 | |
---|---|---|
形式 | スタンドアロンバイナリ | docker cli plugin |
実装 | Python | Golang |
Compose Spec | 準拠していない | 準拠している |
Compose Spec とは
現在のComposeファイルの最新の仕様と考えて良さそうです
Compose仕様は、クラウドやプラットフォームに依存しないコンテナベースのアプリケーションを定義するための、開発者向けの標準仕様です。
Compose Spec の実装はほかにも
具体的に何が変わったのか
気になったものをいくつか取り上げていきます。
仕様はすべてspec.mdにまとまっているので、詳しくはそちらを参照してください。
[2]
Composeファイルの名前--file
オプションを指定せずにdocker-compose
コマンドを実行したときに読み込まれるComposeファイルのデフォルトパスに違いがあります
# V1
$ docker-compose up
# V2
$ docker compose up
V1
v1では作業ディレクトリに以下のファイルが存在すればそれが読み込まれます
- docker-compose.yaml
- docker-compose.yml
V2
一方v2では、基本的に作業ディレクトリにあるcompose.yaml
を読み込みます
ただし、後方互換を維持するために、これまでと同じくdocker-compose.yaml
も読み込んでくれます
- compose.yaml
- compose.yml
- docker-compose.yaml(後方互換のためサポート)
- docker-compose.yml(後方互換のためサポート)
[3]
versionversion: 3.9 # ←非推奨
services:
foo:
image: busybox
Compose V1
では、このversion
の値を見てComposeファイルの検証が行われていました
Compose Specでは後方互換性のために仕様として定義されてはいるものの、このversion
の値を見てComposeファイルの検証を行うべきではないとされており、Compose V2
を使う限りにおいてはもはや不要な項目となっています
[4]
configs設定ファイルのマウントを行うconfigs
セクションが設定できるようになりました
configs
は、コンテナ・ファイルシステムにマウントされるため、動きとしてはこれまでのマウントと同等です
(このように抽象化されてふつうのマウントと区別されることで、Compose Specに準拠したプラットフォームごとにconfigs
を扱う方法を柔軟に変更できるというメリットが有るようです)
短い構文と長い構文の2種類の構文がサポートされています
short syntax
コンテナ内の/<config_name>
に読み取り専用でマウントされます
services:
redis:
image: redis:latest
configs:
- my_config
configs:
my_config:
file: ./my_config.txt
long syntax
services:
redis:
image: redis:latest
configs:
- source: my_config
target: /redis_config # コンテナ内にマウントされるパス
uid: "103"
gid: "103"
mode: 0440 # ファイルのパーミッション
configs:
my_config:
file: ./my_config.txt
[5]
secrets機密情報のマウントを想定したsecrets
セクションが設定できます
プラットフォームの実装がconfigs
と大きく異なる可能性があるため、専用のsecrets
セクションとして分けられているようです
短い構文と長い構文の2種類の構文がサポートされています
short syntax
コンテナ内の/run/secrets/<secret_name>
に読み取り専用でマウントされる
services:
frontend:
image: awesome/webapp
secrets:
- server-certificate
secrets:
server-certificate:
file: ./server.cert
long syntax
services:
frontend:
image: awesome/webapp
secrets:
- source: server-certificate
target: server.cert # コンテナ内の/run/secrets/にマウントされるファイル名
uid: "103"
gid: "103"
mode: 0440 # ファイルのパーミッション
secrets:
server-certificate:
file: ./server.cert
configs
もそうですが、この辺はKubernetesのマニフェストファイルの書き方に近くなった気がします
[6]
extendsComposeファイルに定義された別のサービスを拡張し、オプションで設定を上書きするこができるextends
が利用出るようになりました
extends
をうまく活用することでスッキリとしたcompose.yml
を書くことができそうです
compose.yml
があるとき
こういうservices:
common:
image: busybox
security_opt:
- label:role:ROLE
cli:
extends:
service: common
security_opt:
- label:user:USER
このように展開されます
# 余談ですが、v2からconfigコマンドはconvertコマンドに置き換わっています
#(configはconvertのaliasとして設定されている)
$ docker compose convert
services:
cli:
extends:
service: common
image: busybox
networks:
default: null
security_opt:
- label:role:ROLE
- label:user:USER
common:
image: busybox
networks:
default: null
security_opt:
- label:role:ROLE
networks:
default:
name: sample_default
まとめ
Compose Specに準拠して実装されたDocker Compose V2によって新しく使えるようになったcompose.yml
の書き方を紹介してきました
V2には後方互換性があるため、既存のdocker-compose.ymlをわざわざ修正するほどのコストをかけるべきでは無いかもしれませんが、新しく作る場合はCompose Specに準拠した書き方にしていくのが良さそうです
参考資料
-
https://github.com/compose-spec/compose-spec/blob/master/spec.md#compose-file ↩︎
-
https://github.com/compose-spec/compose-spec/blob/master/spec.md#version-top-level-element ↩︎
-
https://github.com/compose-spec/compose-spec/blob/master/spec.md#configs-top-level-element ↩︎
-
https://github.com/compose-spec/compose-spec/blob/master/spec.md#secrets-top-level-element ↩︎
-
https://github.com/compose-spec/compose-spec/blob/master/spec.md#extends ↩︎
Discussion