複数のコンテナに接続する
現在、Visual Studio Code の1つのウィンドウにつき接続できるコンテナは1つだけです。ただし、複数の VS Code ウィンドウを起動してそれらにアタッチすることができます。
代わりに devcontainer.json を使用したい場合で、Docker Compose を使用している場合は、ソースツリー内の各サービスに対して個別の devcontainer.json ファイルを作成し、それぞれ共通の docker-compose.yml を指すようにすることができます。
これがどのように機能するかを確認するために、以下のソースツリーの例を考えてみます
📁 project-root
📁 .git
📁 .devcontainer
📁 python-container
📄 devcontainer.json
📁 node-container
📄 devcontainer.json
📁 python-src
📄 hello.py
📁 node-src
📄 hello.js
📄 docker-compose.yml
ソース管理が正しく機能するようにコンテナがこのパスを参照できるようにする必要があるため、.git フォルダの場所は重要です。
次に、ルートにある docker-compose.yml が次のようになっていると仮定します
services:
python-api:
image: mcr.microsoft.com/devcontainers/python:1-3.12-bookworm
volumes:
# Mount the root folder that contains .git
- .:/workspace
command: sleep infinity
# ...
node-app:
image: mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm
volumes:
# Mount the root folder that contains .git
- .:/workspace
command: sleep infinity
# ...
その後、Python 開発用に ./devcontainer/python-container/devcontainer.json を次のように設定できます
{
"name": "Python Container",
"dockerComposeFile": ["../../docker-compose.yml"],
"service": "python-api",
"shutdownAction": "none",
"workspaceFolder": "/workspace/python-src"
}
次に、workspaceFolder を変更して、Node.js 開発用に ./devcontainer/node-container/devcontainer.json を設定できます。
{
"name": "Node Container",
"dockerComposeFile": ["../../docker-compose.yml"],
"service": "node-app",
"shutdownAction": "none",
"workspaceFolder": "/workspace/node-src"
}
devcontainer.json ファイル内の "shutdownAction": "none" はオプションですが、VS Code の終了時にもコンテナを実行し続けます。これにより、1つのウィンドウを閉じたことが原因で誤って両方のコンテナをシャットダウンしてしまうのを防ぐことができます。
複数の VS Code ウィンドウで複数のコンテナに接続する
- プロジェクトのルートレベルで VS Code ウィンドウを開きます。
- コマンドパレット(F1)から Dev Containers: Reopen in Container を実行し、
Python Containerを選択します。 - その後、VS Code は両方のコンテナを起動し、現在のウィンドウを再読み込みして、選択したコンテナに接続します。
- 次に、ファイル > 新しいウィンドウ を使用して新しいウィンドウを開きます。
- 現在のウィンドウでプロジェクトをルートレベルで開きます。
- コマンドパレット(F1)から Dev Containers: Reopen in Container を実行し、
Node Containerを選択します。 - 現在の VS Code ウィンドウが再読み込みされ、選択したコンテナに接続されます。
これで、別々のウィンドウから両方のコンテナを操作できるようになります。
単一の VS Code ウィンドウで複数のコンテナに接続する
- プロジェクトのルートレベルで VS Code ウィンドウを開きます。
- コマンドパレット(F1)から Dev Containers: Reopen in Container を実行し、
Python Containerを選択します。 - その後、VS Code は両方のコンテナを起動し、現在のウィンドウを再読み込みして、選択したコンテナに接続します。
- コマンドパレット(F1)から Dev Containers: Switch Container を実行し、
Node Containerを選択します。 - 現在の VS Code ウィンドウが再読み込みされ、選択したコンテナに接続されます。
- 同じコマンドで元に戻すことができます。
2つのコンテナに接続する際に Docker Compose ファイルを拡張する
開発用に Docker Compose ファイルを拡張したい場合は、(必要に応じて)両方のサービスを拡張し、両方の devcontainer.json ファイルから参照される、単一の docker-compose.yml を使用する必要があります。
たとえば、この docker-compose.devcontainer.yml ファイルを考えてみます
services:
python-api:
volumes:
- ~:~/local-home-folder # Additional bind mount
# ...
node-app:
volumes:
- ~/some-folder:~/some-folder # Additional bind mount
# ...
両方の .devcontainer.json ファイルは次のように更新されます
"dockerComposeFile": [
"../../docker-compose.yml",
"../../docker-compose.devcontainer.yml",
]
この compose ファイルのリストはコンテナの起動時に使用されるため、各 devcontainer.json で異なるファイルを参照すると予期せぬ結果を招く可能性があります。