CreaTools LogoCreaTools
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

dbredis が起動してから 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は失敗すると即死。迷ったらクォートで囲め。


関連記事