DevOps

意外と知らないDocker Composeの便利機能5選

Docker Composeは単なる「コンテナを一括起動するツール」ではありません。近年のアップデートで、開発体験を劇的に向上させる機能が多数追加されています。 今回は、知っているようで意外と使われていない、でも知ると手放せなくなる5つの機能を紹介します。

1. docker compose watch で爆速開発

bind mount(ボリュームマウント)特有の遅さや、ファイル権限の問題に悩まされますよね。 watch モードを使えば、ホスト側のファイル変更を検知して、自動的にコンテナ内へのコピーやリビルドを行ってくれます。

services: web: build: . develop: watch: - action: sync path: ./web target: /app/web ignore: - node_modules/ - action: rebuild path: package.json

docker compose watch コマンドで起動すると、ソースコードの変更は即座に同期(sync)され、パッケージ定義の変更時は自動でリビルドが走ります。ホットリロードが効きにくい環境でも強力な武器になります。

2. profiles で環境を使い分け

「デバッグ用のツール(phpMyAdminやpgAdminなど)は、普段は起動したくないけど、必要な時だけ立ち上げたい」 そんな時に便利なのが profiles です。

services: app: image: my-app db-admin: image: dpage/pgadmin4 profiles: - debug

普通に docker compose up しただけでは db-admin は起動しません。 docker compose up --profile debug と指定した時だけ起動します。これで docker-compose.override.yml をごちゃごちゃ管理する必要がなくなります。

3. include でファイル分割の正解

巨大な docker-compose.yml を分割するために、これまで extends やシェルスクリプトでの -f オプション連結をしていましたよね。 公式に include 構文がサポートされました。

# compose.yaml include: - path: ./infra/compose.yaml - path: ./backend/compose.yaml services: proxy: image: nginx depends_on: - backend

これにより、別々のチームが管理するComposeファイルを、パスを指定するだけで簡単に1つのプロジェクトとして統合できます。

4. healthcheckcondition: service_healthy

「DBが立ち上がる前にアプリが起動して死ぬ」問題。depends_on だけでは不十分です。 service_healthy を使うことで、「DBが起動し、接続を受け付ける準備ができた」までアプリの起動を待機させることができます。

services: db: image: postgres healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 backend: build: . depends_on: db: condition: service_healthy

これで再起動ループ地獄から解放されます。

5. name プロパティ

Docker Composeはデフォルトで「フォルダ名」をプロジェクト名(=コンテナ名のプレフィックス)にします。 しかし、これだとフォルダ名を変えただけで別プロジェクト扱いになり、ボリュームが迷子になったりします。

name: my-super-project services: ...

トップレベルに name を書いておけば、フォルダ名に関係なくプロジェクト名が固定されます。CI/CD環境など、ディレクトリ名が動的に変わる場所で特に重要です。

まとめ

Docker Composeは日々進化しています。古い定石(version: '3' を書くなど)は捨てて、新しい機能を積極的に取り入れていきましょう。