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 連携モードでは、image や build ではなく次のキーが主役になります。

キー 役割
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 を足す(ホットリロード)
  • command を sleep infinity にしてエントリープロセスを殺さない(VS Code Server が prstart する)
  • environment に開発用のダミー値を入れる
  • ports を必要なものだけ公開する

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

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

よくあるハマり

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

関連トピック