compose と連携する - dockerComposeFile
Dev Container は単一コンテナだけでなく、`docker-compose.yml` と組み合わせて DB や Redis などを含む複数サービス構成にできる。アプリ側のコンテナを `service` として指定する。
概念図
構文
"dockerComposeFile": "../docker-compose.yml", "service": "app"実例
compose ファイルを重ねて app サービスを開発対象に指定する。
{
"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 は触らない。
# 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:を明示する
関連トピック
devcontainer.json- `devcontainer.json` は Dev Container の設定を記述する中心ファイル。ベースイメージ、ポート転送、VS Code 拡張、起動後コマンドなどをまとめて指定する。 features- features は devcontainer.json から追加のツール(Node、Python、AWS CLI、Docker-in-Docker など)を宣言的に入れる仕組み。OCI アーティファクトとして配布され、Dockerfile を書かずに環境を拡張できる。 devcontainer- Dev Containers は、開発環境そのものをコンテナとして記述・配布する仕組み。VS Code Dev Containers 拡張や GitHub Codespaces と組み合わせ、「誰の手元でも同じ環境」を即座に立ち上げられる。 