尝试以扩展 VS Code 中的代理模式!

连接到多个容器

目前,每个 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
    # ...

然后,您可以为 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 关闭时使容器保持运行——这可以防止您通过关闭一个窗口而意外关闭两个容器。

在多个 VS Code 窗口中连接到多个容器

  1. 在项目的根级别打开一个 VS Code 窗口。
  2. 从命令面板 (F1) 运行 开发容器:在容器中重新打开 并选择 Python 容器
  3. 然后,VS Code 将启动两个容器,重新加载当前窗口并连接到选定的容器。
  4. 接下来,使用 文件 > 新窗口 打开一个新窗口。
  5. 在当前窗口中打开根级别的项目。
  6. 从命令面板 (F1) 运行 开发容器:在容器中重新打开 并选择 Node 容器
  7. 当前的 VS Code 窗口将重新加载并连接到选定的容器。

您现在可以从不同的窗口与两个容器进行交互。

在单个 VS Code 窗口中连接到多个容器

  1. 在项目的根级别打开一个 VS Code 窗口。
  2. 从命令面板 (F1) 运行 开发容器:在容器中重新打开 并选择 Python 容器
  3. 然后,VS Code 将启动两个容器,重新加载当前窗口并连接到选定的容器。
  4. 从命令面板 (F1) 运行 开发容器:切换容器 并选择 Node 容器
  5. 当前的 VS Code 窗口将重新加载并连接到选定的容器。
  6. 您可以使用相同的命令切换回来。

连接到两个容器时扩展 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 中引用不同的文件可能会导致意外结果。