Agent-almanac setup-compose-stack
install
source · Clone the upstream repo
git clone https://github.com/pjt222/agent-almanac
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/ja/skills/setup-compose-stack" ~/.claude/skills/pjt222-agent-almanac-setup-compose-stack-62d671 && rm -rf "$T"
manifest:
i18n/ja/skills/setup-compose-stack/SKILL.mdsource content
Composeスタックのセットアップ
データベース、キャッシュ、ワーカーを含むマルチサービスアプリケーションスタック用のDocker Composeを設定する。
使用タイミング
- データベースやキャッシュを伴うWebアプリの実行
- 複数サービスの開発環境のセットアップ
- APIと並行したバックグラウンドワーカーのオーケストレーション
- チーム間で再現可能なマルチサービス環境が必要な場合
入力
- 必須: アプリケーションサービス(言語、ポート、エントリポイント)
- 必須: 必要なサポートサービス(データベース、キャッシュ、キューなど)
- 任意: 開発 vs 本番の設定
- 任意: カスタムサービス用の既存Dockerfile
手順
ステップ1: コアスタックの定義
services: app: build: context: . dockerfile: Dockerfile ports: - "3000:3000" environment: DATABASE_URL: postgres://appuser:apppass@postgres:5432/appdb REDIS_URL: redis://redis:6379 depends_on: postgres: condition: service_healthy redis: condition: service_started restart: unless-stopped postgres: image: postgres:16 environment: POSTGRES_DB: appdb POSTGRES_USER: appuser POSTGRES_PASSWORD: apppass volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redisdata:/data volumes: pgdata: redisdata:
期待結果:
docker compose upでアプリがデータベースの正常起動を待ってからすべてのサービスが起動する。
ステップ2: ヘルスチェックの追加
ヘルスチェックにより
depends_onでcondition: service_healthyが使用可能になる:
services: postgres: healthcheck: test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"] interval: 5s timeout: 5s retries: 5 redis: healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 app: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 10s timeout: 5s retries: 3 start_period: 10s
ステップ3: ネットワークの設定
services: app: networks: - frontend - backend postgres: networks: - backend nginx: networks: - frontend ports: - "80:80" networks: frontend: driver: bridge backend: driver: bridge
これによりデータベースが直接外部アクセスから分離され、アプリが両方のネットワークをブリッジする。
ステップ4: 環境変数の管理
.envファイル(git-ignored)を作成する:
POSTGRES_PASSWORD=secure_password_here APP_SECRET=your_secret_key
composeで参照する:
services: postgres: environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} app: env_file: - .env
.env.example(gitにコミット)を作成する:
POSTGRES_PASSWORD=changeme APP_SECRET=changeme
ステップ5: ワーカーサービスの追加
services: worker: build: context: . dockerfile: Dockerfile command: ["node", "src/worker.js"] environment: DATABASE_URL: postgres://appuser:apppass@postgres:5432/appdb REDIS_URL: redis://redis:6379 depends_on: postgres: condition: service_healthy redis: condition: service_started restart: unless-stopped deploy: replicas: 2
ステップ6: オプションサービスにプロファイルを使用
services: app: # 常に起動する build: . mailhog: image: mailhog/mailhog ports: - "8025:8025" profiles: - dev adminer: image: adminer ports: - "8080:8080" profiles: - dev
# コアサービスのみ起動 docker compose up # 開発ツール付きで起動 docker compose --profile dev up
ステップ7: 開発用オーバーライドの作成
docker-compose.override.ymlは自動的にマージされる:
services: app: build: target: dev volumes: - .:/app - /app/node_modules environment: NODE_ENV: development DEBUG: "app:*" command: ["npm", "run", "dev"]
ステップ8: ビルドと実行
# すべてのイメージをビルド docker compose build # バックグラウンドで起動 docker compose up -d # ログの表示 docker compose logs -f app # サービスステータスの確認 docker compose ps # 停止と削除 docker compose down # 停止とボリューム削除(完全リセット) docker compose down -v
期待結果: すべてのサービスが起動し、ヘルスチェックが通り、アプリがデータベースとキャッシュに接続する。
失敗時:
docker compose logs <service>を確認する。よくある問題: ポートの競合、環境変数の不足、ヘルスチェックのタイムアウト。
バリデーション
-
がエラーなくすべてのサービスを起動するdocker compose up - データベースとキャッシュのヘルスチェックが通る
- アプリケーションがすべての依存サービスに接続する
- 名前付きボリュームが再起動間でデータを永続化する
-
がgit-ignoredされ、.env
がコミットされている.env.example -
がすべてを正常に停止するdocker compose down - プロファイルが開発ツールと本番サービスを分離する
よくある落とし穴
- ヘルスチェックなし:
なしのcondition: service_healthy
はコンテナの起動のみを待ち、準備完了は待たないdepends_on - composeにハードコードされたパスワード:
ファイルまたはDockerシークレットを使用する。パスワードをコミットしない.env - ボリュームマウントの上書き:
のマウントがイメージ内でビルドされた.:/app
を上書きする。匿名ボリュームを使用する:node_modules/app/node_modules - ポートの競合:
とdocker compose ps
で競合を確認するlsof -i :<port>
キー: Compose V2はversion:
キーを無視する。最新のセットアップでは省略するversion:- WSLパスの問題: WSLからWindowsディレクトリをマウントする場合は
パスを使用する/mnt/c/...
関連スキル
- R固有のDocker Compose設定setup-docker-compose
- composeが参照するDockerfileの作成create-dockerfile
- スタック用に最適化されたイメージのビルドcreate-multistage-dockerfile
- スタックにNginxリバースプロキシを追加configure-nginx