Dock Stay
compose と連携する - dockerComposeFile の使い方・オプション・サンプル

compose と連携する - dockerComposeFile

Dev Container は単一コンテナだけでなく、`docker-compose.yml` と組み合わせて DB や Redis などを含む複数サービス構成にできる。アプリ側のコンテナを `service` として指定する。

概念図

dockerComposeFile diagram

構文

bash
"dockerComposeFile": "../docker-compose.yml", "service": "app"

実例

compose ファイルを重ねて app サービスを開発対象に指定する。

bash
{
  "name": "App + Postgres",
  "dockerComposeFile": ["../docker-compose.yml", "docker-compose.dev.yml"],
  "service": "app",
  "workspaceFolder": "/workspaces/app",
  "forwardPorts": [3000, 5432],
  "postCreateCommand": "npm install",
  "shutdownAction": "stopCompose"
}

dev 側で bind mount と起動コマンドを上書きし、本番用の compose は触らない。

bash
# docker-compose.dev.yml(開発用オーバーライド)
services:
  app:
    volumes:
      - ..:/workspaces/app:cached
    command: sleep infinity
  db:
    environment:
      POSTGRES_PASSWORD: dev

なぜ compose と組み合わせるか

アプリ単体の Dev Container だけでは、DB・キャッシュ・オブジェクトストレージといった依存サービスを別途立ち上げる必要があります。

compose ファイルを一緒に書けば、開発コンテナに VS Code が接続した時点で Postgres / Redis / MinIO なども同時に起動した状態になります。

本番でも docker-compose.yml を使っているなら、その定義を共有しつつ、開発向けの上書きだけを docker-compose.dev.yml として別ファイルに切り出すのが定石です。

Dev Container 側で dockerComposeFile に配列を渡すと、後ろのファイルで前を上書きできます。

devcontainer.json の必須キー

compose 連携モードでは、imagebuild ではなく次のキーが主役になります。

キー 役割
dockerComposeFile 使う compose ファイル(相対パス、複数可)
service VS Code が接続するサービス名
workspaceFolder コンテナ内でのワークスペースパス(compose 側の volume と一致させる)
shutdownAction stopCompose にすると VS Code を閉じた際に compose 全体を止められる

workspaceFolder と compose 側の volumes: ..:/workspaces/app は必ず対応させます。

ここがずれると VS Code が開くパスに何もない、という症状になります。

本番 compose を壊さないオーバーライド術

本番でも使う docker-compose.yml は触らず、開発専用の上書きを別ファイルに切るのが安全です。

典型的な上書き項目は次のとおりです。

  • volumes にソースツリーの bind mount を足す(ホットリロード)
  • commandsleep infinity にしてエントリープロセスを殺さない(VS Code Server が prstart する)
  • environment に開発用のダミー値を入れる
  • ports を必要なものだけ公開する

shutdownAction: stopCompose を有効にしておくと、VS Code を閉じたときに DB コンテナ等まで一緒に停止してくれます。

逆に本番のように常駐させたい場合は none にします。

よくあるハマり

  • command を上書きし忘れる: 本番用の command が即終了するタイプだと Dev Container も落ちる。必ず sleep infinity などに差し替える
  • ボリュームのパスがずれる: compose 側の ..:/workspaces/appworkspaceFolder: /workspaces/app を一致させないと VS Code が空のフォルダを開く
  • features が効かない: compose モードでも features は使えるが、ターゲットサービスのイメージに対して適用される。サイドカー側には入らない
  • ネットワーク名の衝突: 他プロジェクトの compose と同じ network 名を使うと意図せぬ接続が起きる。name: を明示する

関連トピック