现已推出!阅读 10 月份的新功能和修复。

在容器中开发

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. 安装 适用于 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. 安装 开发容器扩展。如果您计划在 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:添加开发容器配置文件...

    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 扩展打开的文件夹中使用 Dev Containers:在容器中重新打开 命令。
  • 从命令面板(F1)中选择 Dev Containers:在容器中打开文件夹...,然后使用本地 \\wsl$ 共享(从 Windows 端)选择一个 WSL 文件夹。

其余快速入门内容照常适用!您可以在 WSL 扩展的文档中了解更多信息

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

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

为此,请执行以下操作:

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

其余开发容器快速入门内容照常适用。您可以在 远程 - SSH 扩展的文档中了解更多信息。如果您发现此模型不满足您的需求,还可以查看 在远程 Docker 主机上进行开发 文章,以了解其他选项。

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

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

为此,请执行以下操作:

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

其余开发容器快速入门内容照常适用。您可以在 远程 - 隧道扩展的文档中了解更多信息。如果您发现此模型不满足您的需求,还可以查看 在远程 Docker 主机上进行开发 文章,以了解其他选项。

在容器中打开现有工作区

如果您发现此模型不满足您的需求,还可以查看 在远程 Docker 主机上进行开发 文章,以了解其他选项。

您可以:

  • 使用 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

    该列表将根据您打开的文件夹的内容自动排序。显示的开发容器模板来自我们的 第一方和社区索引,它是 开发容器规范 的一部分。我们在 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 非常重视安全性,并希望帮助您安全地浏览和编辑代码,无论来源或原始作者如何。 工作区信任功能 让您决定您的项目文件夹是否应该允许或限制自动代码执行。

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

在容器中重新打开文件夹

为现有项目设置开发容器 需要信任本地(或 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 发布您自己的公共或私有功能的说明。

功能规范和分发

功能是开源 开发容器规范 的关键部分。您可以查看 有关功能工作原理的更多信息 以及它们的 分发

预构建开发容器镜像

我们建议使用预构建的镜像,其中包含您需要的工具,而不是每次在开发容器中打开项目时都创建和构建容器镜像。使用预构建的镜像将使容器启动更快,配置更简单,并允许您固定到特定版本的工具以提高供应链安全性并避免潜在的故障。您可以通过使用 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) 中选择 **Dev Containers: Explore a Volume in a Dev Container...**。

您也可以在远程资源管理器中检查您的卷。确保您在下拉菜单中选择了容器,然后您会注意到一个 **Dev Volumes** 部分。您可以右键单击卷以检查其创建信息,例如卷何时创建、将其克隆到其中的存储库以及挂载点。您也可以在开发容器中浏览它。

Right-click dev volumes in Remote Explorer

如果您安装了 Docker 扩展,您可以在 **Docker Explorer** 的 **Volumes** 部分中右键单击卷,然后选择 **Explore in a Development Container**。

Explore in dev container in Docker context menu

管理扩展

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

如果您从扩展视图安装扩展,它将自动安装在正确的位置。您可以根据类别分组判断扩展安装在哪里。将有一个 **Local - Installed** 类别,以及一个用于您的容器的类别。

Workspace Extension Category

Local Extension Category

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

实际上需要远程运行的本地扩展将在 **Local - Installed** 类别中显示为 **Disabled**。选择 **Install** 以在您的远程主机上安装扩展。

Disabled Extensions w/Install Button

您也可以通过转到扩展视图并选择 **Install Local Extensions in Dev Container: {Name}**(使用 **Local - Installed** 标题栏右侧的云按钮)来安装开发容器中所有本地安装的扩展。这将显示一个下拉菜单,您可以在其中选择要在容器中安装哪些本地安装的扩展。

Install all extensions

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

将扩展添加到 devcontainer.json

虽然您可以通过手动编辑 devcontainer.json 文件来添加扩展 ID 列表,但您也可以右键单击扩展视图中的任何扩展,然后选择 **Add to 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 用户 设置。例如,如果您想安装 GitLensResource Monitor 扩展,您将按如下方式指定它们的扩展 ID

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

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

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

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

"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 a Port** 命令来 **临时转发** 新端口,该端口在会话期间有效。

Forward port input

选择端口后,通知会告诉您应该使用哪个本地主机端口来访问容器中的端口。例如,如果您转发了侦听端口 3000 的 HTTP 服务器,则通知可能会告诉您它被映射到本地主机的端口 4123。然后,您可以使用 https://127.0.0.1:4123 连接到此远程 HTTP 服务器。

如果您以后需要访问此信息,它也将在远程资源管理器的 **Forwarded Ports** 部分中提供。

如果您希望 VS Code 记住您转发的任何端口,请在设置编辑器 (⌘, (Windows, Linux Ctrl+,)) 中选中 **Remote: Restore Forwarded Ports**,或在 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) 运行 **Dev Containers: Rebuild Container** 命令来执行此操作。

打开终端

从 VS Code 中在容器中打开终端很简单。打开容器中的文件夹后,您在 VS Code 中打开的 **任何终端窗口** (**Terminal > New Terminal**) 将自动在容器中运行,而不是在本地运行。

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

Using the code CLI

在容器中调试

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

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

容器特定设置

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

Container specific settings tab

默认的容器特定设置

您可以使用 devcontainer.json 中的 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 来更改此行为。

虽然您可以使用命令行来管理您的容器,但您也可以使用 **Remote Explorer**。要停止容器,请从下拉菜单 (如果有) 中选择容器,右键单击正在运行的容器,然后选择 **Stop Container**。您也可以启动已退出的容器、删除容器以及删除最近的文件夹。在详细信息视图中,您可以转发端口并在浏览器中打开已转发的端口。

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 存储库。

已知限制

Dev Containers 限制

  • 不支持 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 上运行而 SSH 客户端(在任何平台上)在版本 >= 8.9 上运行时,Windows 上的 OpenSSH 版本之间存在不兼容性。解决方法是将 Windows 上的 OpenSSH 升级到 8.9 或更高版本,可以使用 winget 或从 Win32-OpenSSH/releases 获取的安装程序。(请注意,ssh-add -l 将正常工作,但 ssh <ssh-server> 将失败并显示 <ssh-server>: Permission denied (publickey)。这也会影响 Git 在使用 SSH 连接到存储库时的行为。)

请查看 这里以获取与容器相关的活动问题的列表

Docker 限制

有关 WindowsMac 的 Docker 故障排除指南,请咨询 Docker 支持资源 以获取更多信息。

Docker 扩展限制

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

扩展限制

目前,大多数扩展程序可以在 Dev Containers 中正常工作,无需修改。但是,在某些情况下,某些功能可能需要更改。如果您遇到扩展问题,请查看 此处有关常见问题和解决方案的摘要,您可以在报告问题时将其告知扩展程序作者。

此外,虽然 Alpine 支持可用,但容器中安装的一些扩展程序可能无法工作,因为扩展程序中的本机代码存在 glibc 依赖项。有关详细信息,请查看 使用 Linux 进行远程开发 文章。

高级容器配置

请查看 高级容器配置 文章,以获取有关以下主题的信息

devcontainer.json 参考

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

问题或反馈

下一步