JSON ⇄ YAML Converter
docker-compose.ymlの書き方|本番で事故らないYAML設定
2025-01-03
この記事を読むと
docker-compose.ymlを本番投入しても事故らないレベルで書けるようになる。
docker-composeは失敗すると即死。YAMLの罠を知らないと、エラーを出さずに間違った設定で起動する。
基本構造
services:
app:
image: node:20
ports:
- "3000:3000"
volumes:
- .:/app
environment:
NODE_ENV: development
⚠ 本番で事故るYAMLの罠
ポート番号
# ❌ 危険(時刻や8進数として解釈される可能性)
ports:
- 80:80
- 022:22
# ✓ 安全(クォートで囲む)
ports:
- "80:80"
- "022:22"
環境変数のon/off
# ❌ 危険(booleanになる)
environment:
FEATURE_FLAG: on
DEBUG: yes
# ✓ 安全(クォートで囲む)
environment:
FEATURE_FLAG: "on"
DEBUG: "yes"
バージョン番号
# ❌ 危険(3.1になる)
version: 3.10
# ✓ 安全(クォートで囲む)
version: "3.10"
迷ったらクォートで囲む。
サービス定義
services:
web:
build: .
# または詳細指定
build:
context: .
dockerfile: Dockerfile.dev
ポート指定
ports:
- "3000:3000" # ホスト:コンテナ
- "127.0.0.1:8080:80" # ホストIPも指定
クォートで囲むのが安全。
ボリューム
volumes:
# バインドマウント
- ./src:/app/src
- ./config:/etc/config:ro # 読み取り専用
# 名前付きボリューム
- db-data:/var/lib/mysql
volumes:
db-data:
環境変数
environment:
# キー: 値形式
NODE_ENV: production
DEBUG: "true" # 文字列にしたいならクォート
# リスト形式
- NODE_ENV=production
- DEBUG=true
env_file
env_file:
- .env
- .env.local
ファイルから読み込む。機密情報は .env に分離。
依存関係
services:
app:
depends_on:
- db
- redis
db:
image: postgres:15
db と redis が起動してから app が起動する。
起動順序だけで十分か?
depends_on は起動順序を制御するだけ。サービスが「準備完了」したかは保証しない。
準備完了を待つならヘルスチェックを使う:
services:
app:
depends_on:
db:
condition: service_healthy
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
ヘルスチェック
services:
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
ネットワーク
services:
app:
networks:
- frontend
- backend
networks:
frontend:
backend:
version について
Compose V1(レガシー)
version: "3.8" # ← 明示的に指定
services:
app:
...
Compose V2 / Compose Spec
# version 不要(または省略推奨)
services:
app:
...
最新のDocker Composeでは version は無視される。 公式ドキュメントを確認すること。
実用的なテンプレート
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
NODE_ENV: development
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
db-data:
チェックリスト
本番投入前に確認:
- ポート番号がクォートで囲まれているか
- 環境変数の
on/off/yes/noがクォートで囲まれているか - バージョン番号がクォートで囲まれているか
- 機密情報が
.envに分離されているか -
depends_onだけでなくヘルスチェックを使っているか
まとめ
| 項目 | ルール |
|---|---|
| ポート番号 | "80:80" クォートで囲む |
環境変数 on/off | "on" クォートで囲む |
| バージョン番号 | "3.10" クォートで囲む |
| 迷ったら | クォートで囲む |
docker-composeは失敗すると即死。迷ったらクォートで囲め。
関連記事
- YAMLの暗黙型変換の罠 — on/off、先頭ゼロの詳細
- YAML構文の基本 — YAML文法
- YAML完全ガイド — シリーズ全体のナビ