支持的工具与服务

本页面概述了当前支持开发容器规范(Development Container Specification)的工具与服务,包括 devcontainer.json 格式。项目中的 devcontainer.json 文件会告知支持开发容器规范的工具和服务,如何访问(或创建)一个具有良好定义的工具和运行时栈的开发容器。

虽然大多数 开发容器属性 适用于任何支持 devcontainer.json 的工具或服务,但仍有少数属性是某些工具特有的,如下所述。

编辑器

Visual Studio Code

Visual Studio Code 特有属性位于 customizations 下的 vscode 中。

"customizations": {
		// Configure properties specific to VS Code.
		"vscode": {
			// Set *default* container specific settings.json values on container create.
			"settings": {},
			"extensions": [],
		}
}
属性 类型 描述
extensions 数组 一个扩展 ID 数组,用于指定容器创建时应安装的扩展。默认为 []
settings 对象 将默认的 settings.json 值添加到容器/机器特定的设置文件中。默认为 {}

请注意,Dev Containers 扩展和 GitHub Codespaces 支持这些 VS Code 属性。

Visual Studio

Visual Studio 在 2022 17.4 版本中增加了对使用 CMake Presets 的 C++ 项目的开发容器支持。它是“使用 C++ 的 Linux 和嵌入式开发”工作负载的一部分,因此请确保在 VS 安装中选中了该项。Visual Studio 会在你工作时管理所用开发容器的生命周期,但它将其视为类似于其他 Linux 或 WSL 目标的远程目标。

你可以在 官方公告博客 中了解更多信息。

IntelliJ IDEA

IntelliJ IDEA 已初步支持通过 SSH 连接远程运行或使用 Docker 本地运行的开发容器。

你可以在 官方公告博客 中了解更多信息。

工具

Dev Container CLI

开发容器命令行界面(CLI)是开发容器规范的参考实现。它目前正在 devcontainers/cli 仓库中开发。它既可以直接使用,也可以供希望支持该规范的工具或服务使用。

CLI 可以读取 devcontainer.json 并据此创建和配置开发容器。它允许使用 GitHub Actions 等 CI 或 DevOps 产品对开发容器配置进行预构建。它可以检测并包含开发容器功能(features),在容器运行时应用它们,并运行诸如 postCreateCommand 之类的 生命周期脚本,提供比单纯的 docker builddocker run 更强大的功能。

VS Code 扩展 CLI

VS Code Dev Containers 扩展 包含一个 Dev Container CLI 的变体,增加了使用命令行在 VS Code 中打开开发容器的功能。它也会随扩展更新而自动更新。

按下 cmd/ctrl+shift+pF1,并选择 Dev Containers: Install devcontainer CLI 命令即可进行安装。

Cachix devenv

Cachix 的 devenv 现在支持自动生成 .devcontainer.json 文件。这为你提供了一种在使用任何支持开发容器规范的工具或服务时使用 Nix 的更方便且一致的方法!

详情请参阅 devenv 文档

Jetify Devbox

Jetify(前身为 jetpack.io)是一项基于 Nix 的应用程序部署服务。DevBox 提供了一种使用 Nix 生成开发环境的方法。Jetify 的 VS Code 扩展 让你能够在任何支持开发容器规范的工具或服务中快速利用 DevBox。

按下 cmd/ctrl+shift+pF1,并选择 Generate Dev Container files 命令即可开始使用!

VS Code Dev Containers 扩展

Visual Studio Code Dev Containers 扩展 允许你使用 Docker 容器 作为功能完备的开发环境。它允许你在容器内(或挂载到容器中)打开任何文件夹,并充分利用 Visual Studio Code 的全部功能集。更多信息请参阅 Dev Containers 文档

提示:如果你在构建并连接到开发容器后对其进行了修改,请务必从命令面板(cmd/ctrl+shift+pF1)运行 Dev Containers: Rebuild Container 以应用所做的更改。

产品特定属性

Dev Containers 扩展实现了特定于 VS Code 的属性

产品特定限制

某些属性在 Dev Containers 扩展中可能存在特定限制。

属性或变量 类型 描述
workspaceMount string 在使用“在容器卷中克隆存储库(Clone Repository in Container Volume)”时暂不支持。
workspaceFolder string 在使用“在容器卷中克隆存储库(Clone Repository in Container Volume)”时暂不支持。
${localWorkspaceFolder} 任何 在使用“在容器卷中克隆存储库(Clone Repository in Container Volume)”时暂不支持。
${localWorkspaceFolderBasename} 任何 在使用“在容器卷中克隆存储库(Clone Repository in Container Volume)”时暂不支持。

服务

GitHub Codespaces

Codespace 是一种托管在云端的开发环境。Codespaces 运行在 GitHub.com 托管的各种基于虚拟机的计算选项上,你可以配置从 2 核到 32 核的机器。你可以从浏览器或在本地使用 Visual Studio Code 连接到你的 codespaces。

提示:如果你在构建并连接到 codespace 后对其进行了修改,请务必从命令面板(cmd/ctrl+shift+pF1)运行 Codespaces: Rebuild Container 以应用所做的更改。

产品特定属性

GitHub Codespaces 支持越来越多的工具,并在适用的情况下支持它们的 devcontainer.json 属性。例如,连接 Codespaces Web 编辑器或 VS Code 可以使用 VS Code 属性

如果你的 Codespaces 项目需要其他存储库的额外权限,你可以通过 repositoriespermissions 属性进行配置。你可以在 Codespaces 文档 中了解更多信息。与其他工具一样,Codespaces 特有的属性位于 customizations 属性下的 codespaces 命名空间内。

"customizations": {
	// Configure properties specific to Codespaces.
	"codespaces": {
		"repositories": {
			"my_org/my_repo": {
				"permissions": {
					"issues": "write"
				}
			}
		}
	}
}

你可以自定义 codespace 创建时初始打开的文件

"customizations": {
	// Configure properties specific to Codespaces.
	"codespaces": {
		"openFiles": [
			"README"
			"src/index.js"
		]
	}
}

路径相对于存储库根目录。它们将按顺序打开,并激活第一个文件。

注意:目前 Codespaces 是从 devcontainer.json 中读取这些属性,而不是从镜像元数据中读取。

产品特定限制

某些属性在 Codespaces 中的应用方式可能有所不同。

属性或变量 类型 描述
mounts 数组 Codespaces 会忽略“bind”挂载,Docker 套接字除外。卷挂载仍然允许。
forwardPorts 数组 Codespaces 尚不支持此属性的 "host:port" 变体。
portsAttributes 对象 Codespaces 尚不支持此属性的 "host:port" 变体。
shutdownAction enum 不适用于 Codespaces。
${localEnv:VARIABLE_NAME} 任何 对于 Codespaces,主机位于云端而非你的本地机器。
customizations.codespaces 对象 Codespaces 从 devcontainer.json 读取此属性,而非镜像元数据。
hostRequirements 对象 Codespaces 从 devcontainer.json 读取此属性,而非镜像元数据。

CodeSandbox

CodeSandbox 提供运行在微型虚拟机(microVM)架构上的云开发环境。每个环境的 VM 规格从 2 vCPU + 2 GB 内存(免费层级)起,最高可达 16 vCPU + 32 GB 内存。

当你将 GitHub 存储库导入 CodeSandbox 时,它会自动为每个分支配置专用的环境。得益于内存快照技术,CodeSandbox 可在两秒内恢复并分叉一个环境。

CodeSandbox 提供对多种编辑器的支持,因此你可以使用 CodeSandbox Web 编辑器、VS Code 或 CodeSandbox iOS 应用进行编码。

提示:将存储库导入 CodeSandbox 后,你可以使用内置 UI 通过开发容器配置环境。

产品特定属性

CodeSandbox 内置支持任何编程语言,并支持基于 Debian 和 Ubuntu 的镜像。

所有特定于 CodeSandbox 的属性都放置在根目录下的 .codesandbox 文件夹中。通常,这会包含一个 tasks.json 文件,用于定义在启动时或点击时运行的命令。

关于这些的更多细节可以在 CodeSandbox 文档 中找到。

产品特定限制

CodeSandbox 使用无根(rootless)Podman 而非 Docker 来运行开发容器。CodeSandbox 还使用 devcontainers/cli 来管理开发容器。因此,无根 Podman 和 Dev Container CLI 的任何限制也适用于 CodeSandbox。

以下属性在 CodeSandbox 中的应用有所不同。

属性或变量 类型 描述
forwardPorts 数组 CodeSandbox 不需要此属性。在开发容器中打开的所有端口都会自动映射到公共 URL。
portsAttributes 对象 CodeSandbox 尚不支持此属性。端口绑定在配置于 .codesandbox/tasks.json 的任务上,并归属于这些任务。
otherPortsAttributes 对象 CodeSandbox 尚不支持此属性。
remoteUser string CodeSandbox 目前忽略此属性,并将其覆盖为 root。CodeSandbox 使用无根 Podman 运行容器。从安全角度来看,在无根 Podman 中以非 root 远程用户身份运行与以 root 远程用户身份运行没有区别。CodeSandbox 计划在未来提供支持。
shutdownAction string 不适用于 CodeSandbox。
capAdd 数组 CodeSandbox 不支持添加 docker 功能(capabilities)。由于容器以非 root 用户身份运行,因此需要 root 访问权限的功能将无法工作。
features 对象 CodeSandbox 会自动将 docker-cli 添加到容器中并连接到主机套接字。像 docker-in-dockerdocker-outside-of-docker 这样的功能工作方式会略有不同。由于容器内可以访问主机上的 docker-cli 和套接字,大多数用例应该可以如预期般工作。
${localEnv:VARIABLE_NAME} 任何 对于 CodeSandbox,主机位于云端而非你的本地机器。
hostRequirements 对象 CodeSandbox 尚不支持此属性。

DevPod

DevPod 是一种纯客户端工具,用于在任何后端上基于 devcontainer.json 创建可重现的开发环境。每个开发环境都运行在容器中,并通过 devcontainer.json 进行指定。通过 DevPod 提供程序(providers),这些环境可以在任何后端上创建,例如本地计算机、Kubernetes 集群、任何可达的远程机器或云中的虚拟机。

Ona (前身为 Gitpod)

Ona(前身为 Gitpod)是软件项目和软件工程代理的任务控制中心。它提供运行在我们云端或你的 VPC 中的安全、临时的开发环境,使人类和代理能够无缝协作。

Ona 完全遵守开发容器规范,因此你可以使用 devcontainer.json 定义可移植且可重现的环境。无论你是引导新开发人员、运行后台代理,还是委派长期运行的迁移任务,Ona Environments 都能确保每个任务都在干净、策略强制执行的环境中运行。

有关约束、自定义和自动化选项的详细信息,请参阅 Ona Dev Container 文档

Schema

你可以探索开发容器 schema 的 VS Code 实现