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

在容器中开发

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 容器镜像。)
  • macOS: Docker Desktop 2.0+。
  • Linux: Docker 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. 安装开发容器扩展。如果你计划在 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 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 文件的信息,请参阅创建开发容器

开发容器特性

开发容器“特性”(Features)是独立、可共享的安装代码和开发容器配置单元。这个名称来源于这样的理念:引用其中一个特性可以让你快速轻松地将更多工具、运行时或库“特性”添加到你的开发容器中,供你或你的协作者使用。

当你使用开发容器:添加开发容器配置文件时,系统会显示一个脚本列表,用于自定义现有的开发容器配置,例如安装 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.json 和一个 install.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 内容合并(有关合并逻辑的信息,请参阅规范)。但最简单地说,你可以直接在 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 命名卷,并希望检查或修改其中的内容。你可以通过从命令面板 (F1) 中选择开发容器:在开发容器中探索卷... 来使用 VS Code 处理这些内容,而无需创建或修改 devcontainer.json 文件。

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

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 文件中强制它在特定位置运行。

例如,以下设置将强制容器工具扩展在本地运行,而远程 - SSH:编辑配置文件扩展在远程运行,而不是使用它们的默认设置

"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 仓库中,然后使用实用程序克隆并应用它们。开发容器扩展内置支持将这些文件与你自己的容器一起使用。如果你对这个概念不熟悉,可以查看现有的各种点文件引导仓库

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

请参阅此处以获取与容器相关的活动问题列表。

Docker 限制

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

容器工具扩展限制

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

扩展限制

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

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

高级容器配置

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

devcontainer.json 参考

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

问题或反馈

故障排除

无法写入文件 (无权限 (FileSystemError))

当你以以下配置运行开发容器时,可能会遇到此问题

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

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

后续步骤