2021年の後半にDocker Compose V2がリリースされましたDocker Compose V2はCompose Spec[1]に準拠しているため、docker-compose.ymlもその仕様に則った書き方ができるようになっています
services:app1:image: awesome/webappconfigs:- my_configsecrets:- server-certificateapp2:image: awesome/databaseextends:service: app1configs:my_config:file: ./my_config.txtsecrets:server-certificate:file: ./server.certservices:app1:configs:-source: my_configimage: awesome/webappnetworks:default:nullsecrets:-source: server-certificateapp2:configs:-source: my_configextends:service: app1image: awesome/databasenetworks:default:nullsecrets:-source: server-certificatenetworks:default:name: sample_defaultsecrets:server-certificate:name: sample_server-certificatefile: /home/nkagami/repository/sample/server.certconfigs:my_config:name: sample_my_configfile: /home/nkagami/repository/sample/my_config.txtCompose Specificationに準拠した新しいdocker composeコマンドです
大雑把に以下のような違いがあります
| v1 | v2 | |
|---|---|---|
| 形式 | スタンドアロンバイナリ | docker cli plugin |
| 実装 | Python | Golang |
| Compose Spec | 準拠していない | 準拠している |
https://qiita.com/tearoom6/items/b06118acb801bd918f35
現在のComposeファイルの最新の仕様と考えて良さそうです
Compose仕様は、クラウドやプラットフォームに依存しないコンテナベースのアプリケーションを定義するための、開発者向けの標準仕様です。
気になったものをいくつか取り上げていきます。
仕様はすべてspec.mdにまとまっているので、詳しくはそちらを参照してください。
--fileオプションを指定せずにdocker-composeコマンドを実行したときに読み込まれるComposeファイルのデフォルトパスに違いがあります
# V1$docker-compose up# V2$docker compose upv1では作業ディレクトリに以下のファイルが存在すればそれが読み込まれます
一方v2では、基本的に作業ディレクトリにあるcompose.yamlを読み込みます
ただし、後方互換を維持するために、これまでと同じくdocker-compose.yamlも読み込んでくれます
両方のファイルが存在する場合、compose.yamlの方が優先される
.├── compose.yaml# ←こっちが優先される└── docker-compose.yamlversion:3.9# ←非推奨services:foo:image: busyboxCompose V1では、このversionの値を見てComposeファイルの検証が行われていました
Compose Specでは後方互換性のために仕様として定義されてはいるものの、このversionの値を見てComposeファイルの検証を行うべきではないとされており、Compose V2を使う限りにおいてはもはや不要な項目となっています
設定ファイルのマウントを行うconfigsセクションが設定できるようになりましたconfigsは、コンテナ・ファイルシステムにマウントされるため、動きとしてはこれまでのマウントと同等です
(このように抽象化されてふつうのマウントと区別されることで、Compose Specに準拠したプラットフォームごとにconfigsを扱う方法を柔軟に変更できるというメリットが有るようです)
短い構文と長い構文の2種類の構文がサポートされています
コンテナ内の/<config_name>に読み取り専用でマウントされます
services:redis:image: redis:latestconfigs:- my_configconfigs:my_config:file: ./my_config.txtservices:redis:image: redis:latestconfigs:-source: my_configtarget: /redis_config# コンテナ内にマウントされるパスuid:"103"gid:"103"mode:0440# ファイルのパーミッションconfigs:my_config:file: ./my_config.txt機密情報のマウントを想定したsecretsセクションが設定できます
プラットフォームの実装がconfigsと大きく異なる可能性があるため、専用のsecretsセクションとして分けられているようです
短い構文と長い構文の2種類の構文がサポートされています
コンテナ内の/run/secrets/<secret_name>に読み取り専用でマウントされる
services:frontend:image: awesome/webappsecrets:- server-certificatesecrets:server-certificate:file: ./server.certservices:frontend:image: awesome/webappsecrets:-source: server-certificatetarget: server.cert# コンテナ内の/run/secrets/にマウントされるファイル名uid:"103"gid:"103"mode:0440# ファイルのパーミッションsecrets:server-certificate:file: ./server.certconfigsもそうですが、この辺はKubernetesのマニフェストファイルの書き方に近くなった気がします
Composeファイルに定義された別のサービスを拡張し、オプションで設定を上書きするこができるextendsが利用出るようになりましたextendsをうまく活用することでスッキリとしたcompose.ymlを書くことができそうです
compose.ymlがあるときservices:common:image: busyboxsecurity_opt:- label:role:ROLEcli:extends:service: commonsecurity_opt:- label:user:USER# 余談ですが、v2からconfigコマンドはconvertコマンドに置き換わっています#(configはconvertのaliasとして設定されている)$docker compose convertservices:cli:extends:service: commonimage: busyboxnetworks:default:nullsecurity_opt:- label:role:ROLE- label:user:USERcommon:image: busyboxnetworks:default:nullsecurity_opt:- label:role:ROLEnetworks:default:name: sample_defaultCompose Specに準拠して実装されたDocker Compose V2によって新しく使えるようになったcompose.ymlの書き方を紹介してきました
V2には後方互換性があるため、既存のdocker-compose.ymlをわざわざ修正するほどのコストをかけるべきでは無いかもしれませんが、新しく作る場合はCompose Specに準拠した書き方にしていくのが良さそうです
https://www.compose-spec.io/
https://github.com/compose-spec/compose-spec
https://docs.docker.com/compose/cli-command/
https://zenn.dev/flyingbarbarian/articles/54d016c462c55b
https://zenn.dev/skanehira/articles/2021-06-03-new-docker-compose
https://qiita.com/tearoom6/items/b06118acb801bd918f35
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↩︎
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。
