連線到多個容器
目前,每個 Visual Studio Code 視窗只能連線到一個容器。但是,您可以啟動多個 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
# ...
然後,您可以按如下方式設定 ./devcontainer/python-container/devcontainer.json 以進行 Python 開發
{
"name": "Python Container",
"dockerComposeFile": ["../../docker-compose.yml"],
"service": "python-api",
"shutdownAction": "none",
"workspaceFolder": "/workspace/python-src"
}
接下來,您可以透過更改 workspaceFolder 來設定 ./devcontainer/node-container/devcontainer.json 以進行 Node.js 開發。
{
"name": "Node Container",
"dockerComposeFile": ["../../docker-compose.yml"],
"service": "node-app",
"shutdownAction": "none",
"workspaceFolder": "/workspace/node-src"
}
devcontainer.json 檔案中的 "shutdownAction": "none" 是可選的,但它會在 VS Code 關閉時保持容器執行——這可以防止您透過關閉一個視窗而意外地關閉兩個容器。
在多個 VS Code 視窗中連線到多個容器
- 在專案的根級別開啟一個 VS Code 視窗。
- 從命令面板 (F1) 執行開發容器:在容器中重新開啟,然後選擇
Python Container。 - VS Code 將啟動兩個容器,重新載入當前視窗並連線到選定的容器。
- 接下來,使用檔案 > 新建視窗開啟一個新視窗。
- 在當前視窗中開啟根級別的專案。
- 從命令面板 (F1) 執行開發容器:在容器中重新開啟,然後選擇
Node Container。 - 當前的 VS Code 視窗將重新載入並連線到選定的容器。
您現在可以從單獨的視窗與兩個容器進行互動。
在單個 VS Code 視窗中連線到多個容器
- 在專案的根級別開啟一個 VS Code 視窗。
- 從命令面板 (F1) 執行開發容器:在容器中重新開啟,然後選擇
Python Container。 - VS Code 將啟動兩個容器,重新載入當前視窗並連線到選定的容器。
- 從命令面板 (F1) 執行開發容器:切換容器,然後選擇
Node Container。 - 當前的 VS Code 視窗將重新載入並連線到選定的容器。
- 您可以使用相同的命令切換回來。
連線到兩個容器時擴充套件 Docker Compose 檔案
如果您想擴充套件 Docker Compose 檔案以進行開發,則應使用單個 docker-compose.yml,它擴充套件了兩個服務(根據需要),並在兩個 devcontainer.json 檔案中引用。
例如,考慮以下 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 中引用不同的檔案可能會產生意外結果。