参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

在容器中开发

Visual Studio Code 开发容器扩展允许您将容器用作功能齐全的开发环境。它允许您在容器内部(或挂载到容器中)打开任何文件夹,并利用 Visual Studio Code 的所有功能。项目中的 devcontainer.json 文件会告诉 VS Code 如何使用定义完善的工具和运行时堆栈访问(或创建)一个开发容器。此容器可用于运行应用程序或分离处理代码库所需的工具、库或运行时。

工作区文件从本地文件系统挂载,或复制或克隆到容器中。扩展在容器内部安装和运行,它们可以完全访问工具、平台和文件系统。这意味着您只需连接到不同的容器即可无缝切换整个开发环境。

Container Architecture

这让 VS Code 提供了本地质量的开发体验,包括完整的 IntelliSense(补全)、代码导航和调试,无论您的工具(或代码)位于何处

开发容器扩展支持两种主要操作模式:

注意:开发容器扩展支持开放的开发容器规范,它使任何工具中的任何人都可以配置一致的开发环境。您可以在我们的开发容器常见问题和规范网站 containers.dev 上了解更多信息。

入门

注意:您可以在入门开发容器教程中了解如何快速开始使用开发容器。

系统要求

本地/远程主机

您可以通过以下几种方式将 Docker 与开发容器扩展一起使用:

  • 本地安装 Docker。
  • 安装在远程环境上的 Docker。
  • 其他符合 Docker 规范的 CLI,本地或远程安装。

您可以在其他 Docker 选项文档中了解更多信息。

以下是一些在本地或远程主机上配置 Docker 的具体方法:

  • Windows: Windows 10 专业版/企业版上的 Docker Desktop 2.0+。Windows 10 家庭版 (2004+) 需要 Docker Desktop 2.3+ 和 WSL 2 后端。(不支持 Docker Toolbox。不支持 Windows 容器镜像。)
  • macOSDocker Desktop 2.0+。
  • LinuxDocker CE/EE 18.06+ 和 Docker Compose 1.21+。(不支持 Ubuntu snap 包。)
  • 远程主机: 需要 1 GB RAM,但建议至少 2 GB RAM 和 2 核 CPU。

容器:

  • x86_64 / ARMv7l (AArch32) / ARMv8l (AArch64) Debian 9+、Ubuntu 16.04+、CentOS / RHEL 7+
  • x86_64 Alpine Linux 3.9+

如果其他基于 glibc 的 Linux 容器具有所需的 Linux 先决条件,它们可能也可以工作。

安装

要开始,请按照以下步骤操作:

  1. 使用以下路径之一或其他 Docker 选项(例如远程主机上的 Docker 或符合 Docker 规范的 CLI)为您自己的操作系统安装和配置 Docker

    Windows / macOS:

    1. 安装 Docker Desktop for Windows/Mac

    2. 如果您在 Windows 上使用 WSL 2,为了确保 WSL 2 后端已启用:右键单击 Docker 任务栏图标并选择设置。勾选使用基于 WSL 2 的引擎,并在资源 > WSL 集成下验证您的分发已启用。

    3. 当不使用 WSL 2 后端时,右键单击 Docker 任务栏图标,选择设置,并在资源 > 文件共享中更新您源代码所在的所有位置。有关故障排除,请参阅提示和技巧

    Linux:

    1. 按照针对您的分发官方 Docker CE/EE 安装说明。如果您使用 Docker Compose,请同时按照Docker Compose 说明

    2. 使用终端运行:sudo usermod -aG docker $USER 将您的用户添加到 docker

    3. 注销并重新登录以使您的更改生效。

  2. 安装 Visual Studio CodeVisual Studio Code Insiders

  3. 安装 开发容器扩展。如果您计划在 VS Code 中使用其他远程扩展,您可以选择安装 远程开发扩展包

使用 Git?

这里有两条需要考虑的提示:

  • 如果您在 Windows 本地和容器内使用相同的存储库,请务必设置一致的行尾。有关详细信息,请参阅提示和技巧
  • 如果您使用 Git 凭据管理器克隆,您的容器应该已经可以访问您的凭据!如果您使用 SSH 密钥,您还可以选择共享它们。有关详细信息,请参阅与容器共享 Git 凭据

选择您的快速入门

本文档包含 3 个快速入门 - 我们建议从最适合您的工作流程和兴趣的快速入门开始:

  1. 想在一个快速示例仓库中尝试开发容器吗?请查看快速入门 1:尝试开发容器
  2. 想将开发容器添加到您现有的本地克隆项目之一吗?请查看快速入门 2:在容器中打开现有文件夹
  3. 想使用仓库的隔离副本,例如,审阅 PR 或调查分支而不影响您的本地工作?请查看快速入门 3:在隔离容器卷中打开 Git 仓库或 PR

快速入门:尝试开发容器

最简单的入门方法是尝试一个示例开发容器。容器教程将引导您设置 Docker 和开发容器扩展,并让您选择一个示例:

Select a sample from the list

注意:如果您已经安装了 VS Code 和 Docker,那么您可以使用在开发容器中打开。您可以在创建开发容器指南中了解更多关于此内容以及如何将其添加到您的仓库。

快速入门:在容器中打开现有文件夹

本快速入门介绍如何为现有项目设置开发容器,以使用文件系统上的现有源代码作为您的全职开发环境。请按照以下步骤操作:

  1. 启动 VS Code,从命令面板 (F1) 或快速操作状态栏项运行 开发容器:在容器中打开文件夹... 命令,然后选择您要为其设置容器的项目文件夹。

    提示: 如果您想在打开文件夹之前编辑容器的内容或设置,您可以改为运行 开发容器:添加开发容器配置文件...

    Quick actions Status bar item

  2. 现在为您的开发容器选择一个起点。您可以从可筛选列表中选择一个基础开发容器模板,或者如果所选文件夹中存在现有 DockerfileDocker Compose 文件,则可以使用它。

    注意: 当使用 Alpine Linux 容器时,某些扩展可能无法工作,因为扩展内部的本地代码存在 glibc 依赖项。

    Select a node Dev Container Template

    列表将根据您打开的文件夹内容自动排序。

    您可以使用其他功能自定义您的开发容器,您可以在下面阅读更多信息

    显示的开发容器模板来自我们的第一方和社区索引,它是开发容器规范的一部分。我们在devcontainers/templates 仓库中托管了一组模板作为规范的一部分。您可以浏览该仓库的 src 文件夹以查看每个模板的内容。

    您还可以选择使用 开发容器 CLI 发布和分发您自己的开发容器模板。

  3. 为容器选择起点后,VS Code 将向您的项目添加开发容器配置文件 (.devcontainer/devcontainer.json)。

  4. VS Code 窗口将重新加载并开始构建开发容器。进度通知提供状态更新。您只需在第一次打开开发容器时构建它;第一次成功构建后打开文件夹将快得多。

    Dev Container Progress Notification

  5. 构建完成后,VS Code 将自动连接到容器。

现在,您可以像在本地打开项目一样在 VS Code 中与您的项目进行交互。从现在开始,当您打开项目文件夹时,VS Code 将自动拾取并重用您的开发容器配置。

提示: 想使用远程 Docker 主机吗?有关信息,请参阅在容器中打开远程 SSH 主机上的文件夹一节。

虽然使用这种方法将本地文件系统绑定挂载到容器中很方便,但它在 Windows 和 macOS 上确实存在一些性能开销。您可以使用一些技术来提高磁盘性能,或者您可以改为使用隔离容器卷在容器中打开仓库

在 Windows 上在容器中打开 WSL 2 文件夹

如果您正在使用 适用于 Linux 的 Windows 子系统 v2 (WSL 2) 并启用了 Docker Desktop 的 WSL 2 后端,您可以在 WSL 内部存储的源代码进行工作!

启用 WSL 2 引擎后,您可以:

  • 使用 WSL 扩展已打开的文件夹中的 开发容器:在容器中重新打开 命令。
  • 从命令面板 (F1) 中选择 开发容器:在容器中打开文件夹...,然后使用本地 \\wsl$ 共享(从 Windows 端)选择一个 WSL 文件夹。

快速入门的其余部分照旧适用!您可以在WSL 扩展文档中了解更多信息。

在容器中打开远程 SSH 主机上的文件夹

如果您使用 Linux 或 macOS SSH 主机,您可以将 远程 - SSH 和开发容器扩展一起使用。您甚至不需要在本地安装 Docker 客户端。

操作步骤如下:

  1. 按照远程 - SSH 扩展的安装和 SSH 主机设置步骤。
  2. 可选: 设置 SSH 基于密钥的身份验证到服务器,这样你就不需要多次输入密码。
  3. 在您的 SSH 主机上安装 Docker。您无需在本地安装 Docker。
  4. 按照远程 - SSH 扩展的快速入门连接到主机并在那里打开文件夹。
  5. 从命令面板(F1⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 开发容器:在容器中重新打开 命令。

开发容器快速入门的其余部分照旧适用。您可以在远程 - SSH 扩展文档中了解更多信息。如果此模型不符合您的需求,您还可以参阅在远程 Docker 主机上开发文章以获取其他选项。

在容器中打开远程隧道主机上的文件夹

您可以将 远程 - 隧道 和开发容器扩展一起使用,以在容器内打开远程主机上的文件夹。您甚至不需要在本地安装 Docker 客户端。这类似于上面的 SSH 主机场景,但使用的是远程 - 隧道。

操作步骤如下:

  1. 按照远程 - 隧道扩展的入门说明。
  2. 在您的隧道主机上安装 Docker。您无需在本地安装 Docker。
  3. 按照远程 - 隧道扩展的步骤连接到隧道主机并在那里打开文件夹。
  4. 从命令面板(F1⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 开发容器:在容器中重新打开 命令。

开发容器快速入门的其余部分照旧适用。您可以在远程 - 隧道扩展文档中了解更多信息。如果此模型不符合您的需求,您还可以参阅在远程 Docker 主机上开发文章以获取其他选项。

在容器中打开现有工作区

如果工作区仅引用了相对于 .code-workspace 文件所在文件夹(或文件夹本身)的子文件夹的相对路径,您还可以通过类似的过程在单个容器中打开 VS Code 多根工作区

您可以:

  • 使用 开发容器:在容器中打开工作区... 命令。
  • 在容器中打开包含 .code-workspace 文件的文件夹后,使用 文件 > 打开工作区...

连接后,您可能需要将 .devcontainer 文件夹添加到工作区,以便在它尚未可见的情况下轻松编辑其内容。

另请注意,虽然您不能在同一个 VS Code 窗口中为同一个工作区使用多个容器,但您可以从不同的窗口使用同时使用多个 Docker Compose 管理的容器

快速入门:在隔离容器卷中打开 Git 存储库或 GitHub PR

虽然您可以在容器中打开本地克隆的存储库,但您可能希望使用存储库的隔离副本进行 PR 审查或调查其他分支,而不会影响您的工作。

存储库容器使用隔离的本地 Docker 卷,而不是绑定到本地文件系统。除了不污染您的文件树之外,本地卷还具有在 Windows 和 macOS 上提高性能的额外好处。(有关如何在其他场景中使用这些类型的卷的信息,请参阅高级配置提高磁盘性能文章。)

例如,请按照以下步骤在存储库容器中打开一个“试用”存储库:

  1. 启动 VS Code 并从命令面板 (F1) 运行 开发容器:在容器卷中克隆存储库...

  2. 在出现的输入框中输入 microsoft/vscode-remote-try-node(或任何其他“试用”存储库)、Git URI、GitHub 分支 URL 或 GitHub PR URL,然后按 Enter

    Input box with a repository name in it

    提示: 如果您选择私人存储库,您可能需要设置凭据管理器或将您的 SSH 密钥添加到您的 SSH 代理。请参阅与容器共享 Git 凭据

  3. 如果您的仓库中没有 .devcontainer/devcontainer.json 文件,系统将要求您从可筛选列表或现有 DockerfileDocker Compose 文件(如果存在)中选择一个起点。

    注意: 当使用 Alpine Linux 容器时,某些扩展可能无法工作,因为扩展内部的本地代码存在 glibc 依赖项。

    Select a node Dev Container Template

    列表将根据您打开的文件夹内容自动排序。显示的开发容器模板来自我们的第一方和社区索引,它是开发容器规范的一部分。我们在devcontainers/templates 仓库中托管了一组模板作为规范的一部分。您可以浏览该仓库的 src 文件夹以查看每个模板的内容。

  4. VS Code 窗口(实例)将重新加载,克隆源代码,并开始构建开发容器。进度通知提供状态更新。

    Dev Container Progress Notification

    如果您在步骤 2 中粘贴了 GitHub 拉取请求 URL,PR 将自动签出,并且 GitHub 拉取请求扩展将安装在容器中。该扩展提供了额外的 PR 相关功能,例如 PR 浏览器、与 PR 评论内联交互以及状态栏可见性。

    PR status in status bar

  5. 构建完成后,VS Code 将自动连接到容器。现在,您可以像在本地克隆代码一样,在这个独立的开发环境中处理存储库源代码。

请注意,如果容器因 Docker 构建错误等原因无法启动,您可以在出现的对话框中选择在恢复容器中重新打开,进入一个“恢复容器”,允许您编辑 Dockerfile 或其他内容。这会在一个最小的容器中打开带有克隆存储库的 Docker 卷,并显示创建日志。修复完成后,使用在容器中重新打开重试。

提示: 想使用远程 Docker 主机吗?有关信息,请参阅在容器中打开远程 SSH 主机上的文件夹一节。

信任您的工作区

Visual Studio Code 非常重视安全性,并希望帮助您安全地浏览和编辑代码,无论来源或原始作者是谁。工作区信任功能可让您决定项目文件夹是否应允许或限制自动代码执行。

开发容器扩展已采用工作区信任。根据您打开和与源代码交互的方式,系统会在不同时间提示您决定是否信任正在编辑或执行的代码。

在容器中重新打开文件夹

为现有项目设置开发容器需要信任本地(或 WSL)文件夹。在窗口重新加载之前,系统会要求您信任本地(或 WSL)文件夹。

此流程有几个例外:

  1. 单击最近条目时。
  2. 如果尚未授予信任,使用在容器中打开文件夹命令将在窗口重新加载后请求信任。

连接到现有容器

连接到现有容器时,系统会要求您确认连接意味着您信任该容器。这只确认一次。

Workspace trust prompt when attaching to container

在卷中克隆存储库

在容器卷中克隆仓库时,系统会要求您确认克隆仓库意味着您信任该仓库。这只确认一次。

Workspace trust prompt when cloning in container volume

检查卷

检查卷受限模式下启动,您可以在容器内部信任该文件夹。

Docker 守护进程远程运行

这意味着信任运行 Docker 守护进程的机器。没有额外的提示需要确认(仅上面列出的本地/WSL 情况)。

创建 devcontainer.json 文件

VS Code 的容器配置存储在 devcontainer.json 文件中。此文件类似于用于调试配置的 launch.json 文件,但它用于启动(或连接到)您的开发容器。您还可以指定容器运行后要安装的任何扩展或用于准备环境的创建后命令。开发容器配置位于 .devcontainer/devcontainer.json 下,或存储为项目根目录中的 .devcontainer.json 文件(注意点前缀)。

从命令面板 (F1) 选择 开发容器:添加开发容器配置文件... 命令将所需文件添加到您的项目作为起点,您可以根据需要进一步自定义。该命令允许您从基于文件夹内容的列表中选择预定义的容器配置,重用现有的 Dockerfile,或重用现有的 Docker Compose 文件。

Select a node Dev Container Template

您还可以手动创建 devcontainer.json 并使用任何镜像、Dockerfile 或一组 Docker Compose 文件作为起点。这是一个使用预构建的 开发容器镜像 的简单示例:

{
  "image": "mcr.microsoft.com/devcontainers/typescript-node",
  "forwardPorts": [3000],
  "customizations": {
    // Configure properties specific to VS Code.
    "vscode": {
      // Add the IDs of extensions you want installed when the container is created.
      "extensions": ["streetsidesoftware.code-spell-checker"]
    }
  }
}

注意: 基于基础镜像中的内容,将已经向容器添加额外的配置。例如,我们在上面添加了 streetsidesoftware.code-spell-checker 扩展,容器还将包括 "dbaeumer.vscode-eslint",因为它是 mcr.microsoft.com/devcontainers/typescript-node 的一部分。这在使用 devcontainer.json 进行预构建时会自动发生,您可以在预构建部分阅读更多相关信息。

要了解更多关于创建 devcontainer.json 文件的信息,请参阅创建开发容器

开发容器特性

开发容器“功能”是自包含的、可共享的安装代码单元和开发容器配置。这个名称来源于这样的想法:引用其中一个功能可以让您快速轻松地向您的开发容器添加更多工具、运行时或库“功能”,供您或您的协作者使用。

当您使用 开发容器:添加开发容器配置文件 时,您会看到一个脚本列表,用于自定义现有的开发容器配置,例如安装 Git 或 Azure CLI。

Dev container Features list drop down

当您在容器中重新构建并重新打开时,您选择的功能将可在您的 devcontainer.json 中使用:

"features": {
    "ghcr.io/devcontainers/features/github-cli:1": {
        "version": "latest"
    }
}

当您直接编辑 devcontainer.json 中的 "features" 属性时,您会获得 IntelliSense:

Intellisense when modifying terraform Feature

开发容器:配置容器功能 命令允许您更新现有配置。

VS Code UI 中源自的功能现在来自一个中央索引,您也可以为其贡献。请参阅开发容器规范网站以获取当前列表,并了解如何发布和分发功能

“始终安装”的功能

与您如何设置始终在开发容器中安装扩展类似,您可以使用 dev.containers.defaultFeatures 用户设置来设置您希望始终安装的功能:

"dev.containers.defaultFeatures": {
    "ghcr.io/devcontainers/features/github-cli:1": {}
},

创建您自己的功能

创建和发布您自己的开发容器功能也很容易。已发布的功能可以作为 OCI 工件存储和共享,来自任何支持的公共或私有容器注册表。您可以在 containers.dev 上查看当前已发布功能的列表。

功能是包含 devcontainer-feature.jsoninstall.sh 入口点脚本的文件夹中的自包含实体。

+-- feature
|    +-- devcontainer-feature.json
|    +-- install.sh
|    +-- (other files)

查看 feature/starter 存储库,了解如何使用开发容器 CLI 发布您自己的公共或私人功能。

功能规范和分发

功能是开源开发容器规范的关键部分。您可以查阅有关功能如何工作及其分发的更多信息。

预构建开发容器镜像

我们建议使用您需要的工具预构建镜像,而不是每次在开发容器中打开项目时都创建和构建容器镜像。使用预构建镜像将加快容器启动速度,简化配置,并允许您锁定到特定版本的工具,以提高供应链安全性并避免潜在的故障。您可以通过使用 GitHub Actions 等 DevOps 或持续集成 (CI) 服务安排构建来自动化预构建镜像。

更好的是——预构建的镜像可以包含开发容器元数据,这样当您引用一个镜像时,设置将自动拉取过来。

我们建议使用 开发容器 CLI(或其他支持 规范 的实用程序,例如 GitHub Action)来预构建您的镜像,因为它与开发容器扩展的最新功能(包括开发容器功能)保持同步。构建镜像后,您可以将其推送到容器注册表(例如 Azure Container RegistryGitHub Container RegistryDocker Hub)并直接引用它。

您可以使用 devcontainers/ci 仓库中的 GitHub Action 来帮助您在工作流中重用开发容器。

有关更多信息,请参阅关于预构建镜像的开发容器 CLI 文章

继承元数据

您可以通过镜像标签在预构建镜像中包含开发容器配置和功能元数据。这使得镜像自包含,因为当引用镜像时(无论是在 Dockerfile 中直接、在 FROM 中引用,还是在 Docker Compose 文件中),这些设置都会自动被拾取。这有助于防止您的开发容器配置和镜像内容不同步,并允许您通过简单的镜像引用将相同的配置更新推送到多个存储库。

当您使用 开发容器 CLI(或其他支持 规范 的实用程序,例如 GitHub ActionAzure DevOps 任务)进行预构建时,此元数据标签将自动添加,并包含来自 devcontainer.json 和任何引用的开发容器功能的设置。

这允许您有一个单独的更复杂devcontainer.json,用于预构建镜像,然后在一个或多个存储库中使用一个大大简化devcontainer.json。镜像的内容将在创建容器时与此简化的 devcontainer.json 内容合并(有关合并逻辑的信息,请参阅规范)。但最简单地说,您只需在 devcontainer.json 中直接引用镜像即可使设置生效:

{
  "image": "mcr.microsoft.com/devcontainers/go:1"
}

请注意,您也可以选择手动将元数据添加到镜像标签中。即使您没有使用开发容器 CLI 进行构建,这些属性也会被拾取(即使您使用,CLI 也可以更新它们)。例如,考虑以下 Dockerfile 片段:

LABEL devcontainer.metadata='[{ \
  "capAdd": [ "SYS_PTRACE" ], \
  "remoteUser": "devcontainer", \
  "postCreateCommand": "yarn install" \
}]'

检查卷

有时您可能会遇到需要检查或更改 Docker 命名卷的情况。您可以使用 VS Code 来处理这些内容,而无需创建或修改 devcontainer.json 文件,只需从命令面板 (F1) 中选择 开发容器:在开发容器中探索卷...

您还可以在远程资源管理器中检查您的卷。确保在下拉列表中选择了“容器”,然后您会注意到一个开发卷部分。您可以右键单击卷以检查其创建信息,例如卷的创建时间、克隆到其中的存储库以及挂载点。您还可以在开发容器中探索它。

Right-click dev volumes in Remote Explorer

如果您安装了 容器工具扩展,您可以右键单击容器资源管理器部分中的卷,然后选择在开发容器中探索

Explore in dev container in Container Tools context menu

管理扩展

VS Code 在两个地方运行扩展:本地 UI/客户端侧,或在容器中。虽然影响 VS Code UI 的扩展(如主题和代码片段)安装在本地,但大多数扩展将驻留在特定容器中。这允许您在容器中仅安装给定任务所需的扩展,并通过连接到新容器无缝切换整个工具链。

如果您从“扩展”视图安装扩展,它将自动安装在正确的位置。您可以根据类别分组判断扩展安装在何处。将有一个本地 - 已安装类别,还有一个用于您的容器的类别。

Workspace Extension Category

Local Extension Category

注意: 如果您是扩展作者,并且您的扩展无法正常工作或安装在错误的位置,请参阅支持远程开发以获取详细信息。

实际需要在远程运行的本地扩展将显示在本地 - 已安装类别中,并显示为已禁用。选择安装以在您的远程主机上安装扩展。

Disabled Extensions w/Install Button

您还可以通过转到“扩展”视图并使用本地 - 已安装标题栏右侧的云按钮选择在开发容器中安装本地扩展:{名称}来在开发容器中安装所有本地安装的扩展。这将显示一个下拉菜单,您可以在其中选择要在容器中安装的本地安装扩展。

Install all extensions

但是,某些扩展可能要求您在容器中安装其他软件。如果您遇到问题,请查阅扩展文档以获取详细信息。

将扩展添加到 devcontainer.json

虽然您可以手动编辑 devcontainer.json 文件以添加扩展 ID 列表,但您也可以在“扩展”视图中右键单击任何扩展并选择添加到 devcontainer.json

Add to devcontainer.json menu

选择退出扩展

如果基础镜像或功能配置了您不想在开发容器中安装的扩展,您可以通过在扩展名称前加一个减号来选择退出。例如:

{
  "image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm",
  "customizations": {
    "vscode": {
      "extensions": ["-dbaeumer.vscode-eslint"]
    }
  }
}

“始终安装”的扩展

如果您希望始终在任何容器中安装某些扩展,您可以更新 dev.containers.defaultExtensions 用户设置。例如,如果您想安装 GitLens资源监视器 扩展,您将按如下方式指定它们的扩展 ID:

"dev.containers.defaultExtensions": [
    "eamodio.gitlens",
    "mutantdino.resourcemonitor"
]

高级:强制扩展在本地或远程运行

扩展通常设计和测试为仅在本地或远程运行,而不是两者都运行。但是,如果扩展支持,你可以在 settings.json 文件中强制它在特定位置运行。

例如,以下设置将强制 Container Tools 扩展在本地运行,以及 Remote - SSH: Editing Configuration Files 扩展在远程运行,而不是使用它们的默认设置:

"remote.extensionKind": {
    "ms-azuretools.vscode-containers": [ "ui" ],
    "ms-vscode-remote.remote-ssh-edit": [ "workspace" ]
}

"ui" 而不是 "workspace" 的值将强制扩展在本地 UI/客户端侧运行。通常,这仅应用于测试,除非扩展文档另有说明,因为它可能导致扩展崩溃。有关详细信息,请参阅首选扩展位置一节。

转发或发布端口

容器是独立的环境,因此如果您想访问容器内的服务器、服务或其他资源,您将需要“转发”或“发布”端口到您的主机。您可以配置您的容器始终暴露这些端口,或者只临时转发它们。

始终转发端口

您可以使用 devcontainer.json 中的 forwardPorts 属性指定一个端口列表,您在连接或在容器中打开文件夹时始终希望转发这些端口。

"forwardPorts": [3000, 3001]

只需重新加载/重新打开窗口,当 VS Code 连接到容器时,该设置将生效。

暂时转发端口

如果您需要访问一个您没有添加到 devcontainer.json 或在 Docker Compose 文件中发布的端口,您可以通过从命令面板 (F1) 运行转发端口命令来临时转发一个新端口,持续整个会话。

Forward port input

选择端口后,通知将告诉您用于访问容器中端口的 localhost 端口。例如,如果您转发了一个监听端口 3000 的 HTTP 服务器,通知可能会告诉您它被映射到 localhost 上的端口 4123。然后您可以使用 https://:4123 连接到这个远程 HTTP 服务器。

如果您以后需要访问此信息,可以在远程资源管理器的转发端口部分找到。

如果您希望 VS Code 记住您已转发的任何端口,请在“设置”编辑器中勾选远程:恢复转发端口⌘, (Windows, Linux Ctrl+,))或在 settings.json 中设置 "remote.restoreForwardedPorts": true

Restore forwarded ports setting

发布端口

Docker 有一个在创建容器时“发布”端口的概念。发布的端口行为与您提供给本地网络的端口非常相似。如果您的应用程序只接受来自 localhost 的调用,它将拒绝来自已发布端口的连接,就像您的本地机器会拒绝网络调用一样。另一方面,转发的端口实际上看起来像应用程序的 localhost。每种情况在不同情况下都可能有用。

要发布端口,您可以:

  1. 使用 appPort 属性: 如果您在 devcontainer.json 中引用镜像或 Dockerfile,您可以使用 appPort 属性将端口发布到主机。

    "appPort": [ 3000, "8921:5000" ]
    
  2. 使用 Docker Compose 端口映射: 端口映射可以轻松添加到您的 docker-compose.yml 文件以发布额外的端口。

    ports:
    - "3000"
    - "8921:5000"
    

在每种情况下,您都需要重建容器以使设置生效。当您连接到容器时,可以通过在命令面板 (F1) 中运行 开发容器:重建容器 命令来完成此操作。

打开终端

从 VS Code 在容器中打开终端很简单。一旦您在容器中打开了一个文件夹,您在 VS Code 中打开的任何终端窗口终端 > 新建终端)都将自动在容器中运行,而不是在本地运行。

您还可以使用此终端窗口中的 code 命令行执行多项操作,例如在容器中打开新文件或文件夹。键入 code --help 以了解命令行中可用的选项。

Using the code CLI

在容器中调试

在容器中打开文件夹后,您可以使用 VS Code 的调试器,就像在本地运行应用程序时一样。例如,如果您在 launch.json 中选择启动配置并开始调试 (F5),应用程序将在远程主机上启动并连接调试器。

有关在 .vscode/launch.json 中配置 VS Code 调试功能的详细信息,请参阅调试文档。

容器特定设置

当您连接到开发容器时,VS Code 的本地用户设置也会被重用。虽然这保持了您用户体验的一致性,但您可能希望在您的本地机器和每个容器之间更改其中一些设置。幸运的是,一旦您连接到容器,您还可以通过从命令面板 (F1) 运行 首选项:打开远程设置 命令或在设置编辑器中选择远程选项卡来设置容器特定设置。这些设置将在您连接到容器时覆盖您已有的任何本地设置。

Container specific settings tab

默认容器特定设置

您可以使用 settings 属性在 devcontainer.json 中包含容器特定设置的默认值。一旦容器创建,这些值将自动放置在容器内的容器特定设置文件中。

例如,将此添加到 .devcontainer/devcontainer.json 将设置 Java 主路径:

// Configure tool-specific properties.
"customizations": {
    // Configure properties specific to VS Code.
    "vscode": {
        "settings": {
            "java.home": "/docker-java-home"
        }
    }
}

由于这只是建立默认值,因此在容器创建后您仍然可以根据需要更改设置。

管理容器

默认情况下,当您打开文件夹时,开发容器扩展会自动启动 devcontainer.json 中提到的容器。当您关闭 VS Code 时,该扩展会自动关闭您已连接的容器。您可以通过向 devcontainer.json 添加 "shutdownAction": "none" 来更改此行为。

虽然您可以使用命令行管理容器,但您也可以使用远程资源管理器。要停止容器,请从下拉列表中选择“容器”(如果存在),右键单击正在运行的容器,然后选择停止容器。您还可以启动已退出的容器、移除容器和移除最近的文件夹。从“详细信息”视图中,您可以转发端口并在浏览器中打开已转发的端口。

Containers Explorer screenshot

如果您想清理镜像或批量删除容器,请参阅清理未使用的容器和镜像以获取不同选项。

使用点文件仓库进行个性化设置

点文件是文件名以点(.)开头的文件,通常包含各种应用程序的配置信息。由于开发容器可以涵盖广泛的应用程序类型,因此将这些文件存储在某个地方会很有用,这样您就可以在容器启动并运行后轻松地将它们复制到容器中。

一种常见的方法是将这些点文件存储在 GitHub 存储库中,然后使用实用程序克隆并应用它们。开发容器扩展内置支持在您自己的容器中使用这些文件。如果您对这个想法不熟悉,请查看现有的不同点文件引导存储库

要使用它,请将您的 dotfiles GitHub 存储库添加到 VS Code 的用户设置(⌘, (Windows, Linux Ctrl+,)),如下所示:

Settings for dotfiles

或者在 settings.json 中:

{
  "dotfiles.repository": "your-github-id/your-dotfiles-repo",
  "dotfiles.targetPath": "~/dotfiles",
  "dotfiles.installCommand": "install.sh"
}

从此时起,每当创建容器时都会使用点文件仓库。

已知限制

开发容器限制

  • 支持 Windows 容器镜像。
  • 多根工作区中的所有根/文件夹都将在同一个容器中打开,无论在较低级别是否存在配置文件。
  • 支持非官方的 Ubuntu Docker snap Linux 包。请遵循适用于您发行版的官方 Docker 安装说明
  • 不支持 Windows 上的 Docker Toolbox。
  • 如果你使用 SSH 克隆 Git 仓库,并且你的 SSH 密钥有密码短语,VS Code 的拉取和同步功能在远程运行时可能会挂起。请使用不带密码短语的 SSH 密钥,使用 HTTPS 克隆,或者从命令行运行 git push 来解决此问题。
  • 本地代理设置不会在容器内部重用,这可能会阻止扩展工作,除非配置了适当的代理信息(例如,具有适当代理信息的全局 HTTP_PROXYHTTPS_PROXY 环境变量)。
  • 当 ssh-agent 运行版本 <= 8.8 且 SSH 客户端(在任何平台)运行版本 >= 8.9 时,Windows 上的 OpenSSH 版本之间存在不兼容性。解决方法是将 Windows 上的 OpenSSH 升级到 8.9 或更高版本,可以使用 winget 或从 Win32-OpenSSH/releases 安装程序。(请注意,ssh-add -l 将正常工作,但 ssh 将失败并显示 : Permission denied (publickey)。这也会影响使用 SSH 连接到存储库的 Git。)

有关与容器相关的活动问题列表,请参阅此处

Docker 限制

请参阅 Docker 故障排除指南,了解 WindowsMac,并查阅 Docker 支持资源以获取更多信息。

容器工具扩展限制

如果您在 WSL、远程 - 隧道或远程 - SSH 窗口中使用容器工具或 Kubernetes 扩展,则在“容器资源管理器”或“Kubernetes”视图中使用附加 Visual Studio Code 上下文菜单操作将再次要求从可用容器中进行选择。

扩展限制

目前,大多数扩展无需修改即可在开发容器内工作。但是,在某些情况下,某些功能可能需要更改。如果您遇到扩展问题,请参阅此处,了解常见问题和解决方案的摘要,您可以在报告问题时向扩展作者提及这些内容。

此外,虽然支持 Alpine,但容器中安装的一些扩展可能由于扩展中的原生代码中存在 glibc 依赖项而无法工作。有关详细信息,请参阅使用 Linux 进行远程开发文章。

高级容器配置

请参阅高级容器配置文章,了解以下主题:

devcontainer.json 参考

有一个完整的 devcontainer.json 参考,您可以在其中查看文件模式,以帮助您自定义开发容器并控制如何连接到正在运行的容器。

问题或反馈

故障排除

无法写入文件 (NoPermissions (FileSystemError))

在以下配置中运行开发容器时,您可能会遇到此问题:

  • Docker Desktop 使用适用于 Linux 的 Windows 子系统 (WSL) 后端运行
  • 启用增强容器隔离 (ECI)

请查看问题 #8278 以获取可能的解决方法。

后续步骤