现已可用!了解 11 月的新功能和修复。

在容器内进行开发

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 Pro/Enterprise 上的 Docker Desktop 2.0+。Windows 10 Home (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 或与 Docker 兼容的 CLI。

    Windows / macOS:

    1. 安装适用于 Windows/Mac 的 Docker Desktop

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

    3. 如果不使用 WSL 2 后端,请右键单击 Docker 任务栏项,选择设置,然后使用您保存源代码的任何位置更新资源 > 文件共享。有关故障排除,请参阅提示和技巧

    Linux:

    1. 按照适用于您的发行版的 Docker CE/EE 官方安装说明进行操作。如果您正在使用 Docker Compose,请同时按照Docker Compose 指令进行操作。

    2. 通过使用终端运行以下命令将您的用户添加到 docker 组:sudo usermod -aG docker $USER

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

  2. 安装 Visual Studio CodeVisual Studio Code Insiders

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

正在使用 Git 吗?

这里有两个提示供您参考

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

选择快速入门

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

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

快速入门:尝试开发容器

最简单的入门方法是试用其中一个示例开发容器。容器教程将引导您完成 Docker 和 Dev Containers 扩展的设置,并允许您选择一个示例

Select a sample from the list

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

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

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

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

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

    Quick actions Status bar item

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

    注意: 当使用 Alpine Linux 容器时,某些扩展可能由于扩展内部本机代码中的 glibc 依赖项而无法工作。

    Select a node Dev Container Template

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

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

    显示的开发容器模板来自我们的第一方和社区索引,这是Dev Container 规范的一部分。我们在 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 扩展打开的文件夹中使用 Dev Containers: 在容器中重新打开 命令。
  • 从命令面板 (F1) 中选择 Dev Containers: 在容器中打开文件夹...,然后使用本地 \\wsl$ 共享(从 Windows 端)选择一个 WSL 文件夹。

其余的快速入门按原样适用!您可以在其文档中了解有关WSL 扩展的更多信息

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

如果您使用的是 Linux 或 macOS SSH 主机,则可以一起使用 Remote - SSH 和 Dev Containers 扩展。您甚至不需要在本地安装 Docker 客户端。

为此,请执行以下操作

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

其余的 Dev Containers 快速入门按原样适用。您可以在其文档中了解有关Remote - SSH 扩展的更多信息。如果此模型不能满足您的需求,您还可以查看在远程 Docker 主机上开发文章以了解其他选项。

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

您可以一起使用 Remote - Tunnels 和 Dev Containers 扩展,以在容器内打开远程主机上的文件夹。您甚至不需要在本地安装 Docker 客户端。这与上面的 SSH 主机场景类似,但使用 Remote - Tunnels 代替。

为此,请执行以下操作

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

其余的 Dev Containers 快速入门按原样适用。您可以在其文档中了解有关Remote - Tunnels 扩展的更多信息。如果此模型不能满足您的需求,您还可以查看在远程 Docker 主机上开发文章以了解其他选项。

在容器中打开现有工作区

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

您可以执行以下操作之一

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

连接后,您可能希望.devcontainer 文件夹添加到工作区,以便在它尚未可见时轻松编辑其内容。

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

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

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

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

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

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

  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

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

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

    Dev Container Progress Notification

    如果你在步骤 2 中粘贴了 GitHub 拉取请求 URL,则会自动检出 PR,并且 GitHub Pull Requests 扩展将安装在容器中。该扩展提供了其他与 PR 相关的功能,例如 PR 资源管理器、与内联 PR 注释交互以及状态栏可见性。

    PR status in status bar

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

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

提示: 想使用远程 Docker 主机吗?请参阅关于在容器中打开远程 SSH 主机上的文件夹的部分以获取信息。

信任您的工作区

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

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

在容器中重新打开文件夹

为现有项目设置开发容器 需要信任本地(或 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 规范站点,了解当前列表,并了解如何发布和分发功能

“始终安装”功能

与你可以设置始终在你的开发容器中安装的扩展类似,你可以使用 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 发布你自己的公共或私有功能的说明。

功能规范和分发

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

预构建开发容器映像

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

更好的是 - 预构建的映像可以包含开发容器元数据,因此当你引用映像时,设置将自动被提取过来。

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

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

转到 有关预构建映像的开发容器 CLI 文章以了解更多信息。

继承元数据

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

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

这允许您拥有一个单独的更复杂的 devcontainer.json 文件,用于预构建您的镜像,然后在多个存储库中使用一个显著简化的文件。镜像的内容将在您创建容器时与这个简化的 devcontainer.json 内容合并(有关合并逻辑的信息,请参阅规范)。但最简单的情况是,您可以直接在 devcontainer.json 中引用镜像,以使设置生效。

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

请注意,您也可以选择手动将元数据添加到镜像标签。即使您没有使用开发容器 CLI 进行构建,这些属性也会被获取(并且即使您使用了 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

如果您安装了Docker 扩展,您可以在Docker 资源管理器部分中右键单击一个卷,然后选择在开发容器中浏览

Explore in dev container in Docker 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 文件中的特定位置运行。

例如,以下设置将强制Docker扩展在本地运行,而Remote - SSH: 编辑配置文件扩展在其默认位置之外,在远程运行

"remote.extensionKind": {
    "ms-azuretools.vscode-docker": [ "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://127.0.0.1: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"
        }
    }
}

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

管理容器

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

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

Containers Explorer screenshot

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

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

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

一种常见的方法是将这些 dotfiles 存储在 GitHub 存储库中,然后使用实用程序克隆并应用它们。Dev Containers 扩展具有内置支持,可以将这些文件用于您自己的容器。如果您不熟悉这个概念,请查看存在的不同的dotfiles 引导存储库

要使用它,请将您的 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"
}

从此刻开始,每当创建容器时,都会使用 dotfiles 存储库。

已知限制

开发容器的限制

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

请参阅此处,查看与容器相关的活跃问题列表。

Docker 的限制

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

Docker 扩展的限制

如果您从 WSL、Remote - Tunnels 或 Remote - SSH 窗口使用 Docker 或 Kubernetes 扩展,则在 Docker 或 Kubernetes 视图中使用 连接 Visual Studio Code 上下文菜单操作将要求您第二次从可用的容器中进行选择。

扩展的限制

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

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

高级容器配置

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

devcontainer.json 参考

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

问题或反馈

后续步骤