docker-compose up
ではなく docker compose up
を使うように推奨されていることは知っていたが、ちゃんとキャッチアップしてなかったのでした。また、その過程で Compose V2 以外にも新たに知ったことがあったのでここに記す。
docker-compose との違い
大雑把には以下が異なる。
docker-compose
は docker とは別のスタンドアローンバイナリだったが、docker compose
は docker cli plugin として提供されるdocker compose
は Compose Spec に準拠するようになった
Compose Spec
Composeファイルの標準仕様で、プラットフォームやクラウドに依存しない仕様として策定されている模様。
Compose Spec V2 では従来から主に以下が変更/追加されている。
- Composeファイルは
docker-compose.yml
からcompose.yaml
になった - トップレベルの
version
は非推奨になった - 設定ファイルのマウントを行う
configs
が追加された - 秘匿情報のマウントを行う
secrets
が追加された - 設定の拡張を行う
extends
が追加された
1. 仕様ファイルは docker-compose.yml から compose.yaml になった
そのまま。後方互換性のため docker-compose.yml
も使えるが、今後標準は compose.yaml
となる。なお、Compose Spec では compose.yml
も使えるが、拡張子は yaml
のほうが好ましいとのこと。
2. トップレベルの version は非推奨になった
今までは、トップレベルの version
でComposeファイルを検証していたが、これが今後非推奨となるので記述しなくなる模様。
3. 設定ファイルのマウントを行う configs が追加された
今までは、volumes
で行っていたが、今後は設定ファイルの類は configs
を使用する。docker compose を使っている限りだと volumes
と特に大差はないようだが、プラットフォームごとに実装方法を変えられるように独立した模様。
compose.yaml:
services: db: image: mysql:8 configs: - source: mysql-config target: /etc/mysql/conf.d/my.cnf ... configs: mysql-config: file: ./my.cnf
4. 秘匿情報のマウントを行う secrets が追加された
秘匿情報のマウントが行える secrets
が追加された。configs
とは実装が異なる可能性があるので、独立している模様。
compose.yaml:
services: app: image: golang:1.20.1 secrets: - source: app-secrets target: /app/.env ... secrets: app-secrets: file: ./app-secrets.env
5. 設定の拡張を行う extends が追加された
他のserviceの設定をマージ/拡張できるようになる extends
が追加された。同一ファイルのみならず、別ファイルも参照できる模様。
compose.common.yaml:
services: common: init: true environment: TZ: utc
compose.yaml:
services: app: image: golang:1.20.1 extends: file: compose.common.yaml service: common ... db: image: mysql:8 extends: file: compose.common.yaml service: common ...
Compose V2 以外のアレコレ
mysqladmin ping を使って、DBコンテナのMySQLに接続できる状態になってから、アプリケーションコンテナを起動する
depends_on
を使えば、コンテナ間の依存関係を定義できるので、DBコンテナが起動してからアプリケーションコンテナを起動するのができたし、今までもこれを使ってた。
compose.yaml:
services: app: image: golang:1.20.1 depends_on: - db ... db: image: mysql:8 ...
しかし、これだとdbコンテナが起動したあとに対象コンテナを起動するという指定にすぎないので、dbコンテナが起動しているがMySQLにはまだ接続できない状態には対処できない。その場合はdbコンテナの healthcheck
で mysqladmin ping
で疎通確認し、依存先コンテナの depends_on
で condition: service_healthy
を指定すればできる。
compose.yaml:
services: app: image: golang:1.20.1 depends_on: db: condition: service_healthy ... db: image: mysql:8 healthcheck: test: ["CMD", "mysqladmin" ,"ping", "-h", "0.0.0.0"] interval: 1s timeout: 1s retries: 30 start_period: 1s ...
docker compose で作成されるコンテナ名などのプレフィックスを変更する
docker compose で作成されるコンテナ名などのプレフィックスは、Composeファイルのトップレベルの name
によって指定できる。また、COMPOSE_PROJECT_NAME
環境変数でこの指定はオーバーライドできる。
compose.yaml:
name: docker-compose-v2 services: ...
$ docker compose up [+] Running 4/3 ⠿ Network docker-compose-v2_default Created 0.0s ⠿ Volume "docker-compose-v2_db" Created 0.0s ⠿ Container docker-compose-v2-db-1 Created 0.1s ⠿ Container docker-compose-v2-app-1 Created 0.1s ...
$ COMPOSE_PROJECT_NAME=other-name docker compose up [+] Running 4/3 ⠿ Network other-name_default Created 0.0s ⠿ Volume "other-name_db" Created 0.0s ⠿ Container other-name-db-1 Created 0.1s ⠿ Container other-name-app-1 Created 0.1s ...
なお、Composeファイルでは環境変数で設定値の指定ができるが、name
では使用できない模様。
compose.yaml:
name: ${BASE_NAME}-docker-compose-v2 services: ...
$ BASE_NAME=hoge docker compose up [+] Running 4/4 ⠿ Network base_name-docker-compose-v2_default Created 0.1s ⠿ Volume "base_name-docker-compose-v2_db" Created 0.0s ⠿ Container base_name-docker-compose-v2-db-1 Created 0.1s ⠿ Container base_name-docker-compose-v2-app-1 Created 0.6s ...
環境
- OS:
macOS Ventura 13.2
- Docker Desktop:
4.16.2
- Docker Engine:
20.10.22
- Docker Compose:
2.15.1
参考
Compose V2
- Docker Compose V2で変わったdocker-compose.ymlの書き方
- compose-spec/spec.md at master · compose-spec/compose-spec
その他
- docker-composeでMySQLの起動を待つ - matobaの備忘録
- MySQL :: MySQL 8.0 リファレンスマニュアル :: 4.5.2 mysqladmin — A MySQL Server 管理プログラム
サンプルコード
この記事で使用したサンプルコードは以下にある。