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

Dev Container CLI

本主题介绍开发容器命令行界面 (devcontainer CLI),它允许您构建和管理开发容器,并与 开发容器规范 相辅相成。

开发容器

一致、可预测的环境是高效、愉悦的软件开发体验的关键。

容器(例如 Docker 容器)历来用于在部署时标准化应用程序,但它们也有可能支持其他场景,包括持续集成 (CI)、测试自动化和功能齐全的编码环境。开发容器提供此工作环境,并确保您的项目拥有所需的工具和软件,无论它多么复杂和分布式,或者仅仅需要一些简单的需求。

Diagram comparing dev versus production containers

开发容器通过 Dev Containers 扩展在 Visual Studio Code 中受支持,并在 GitHub Codespaces 中受支持。此支持由 devcontainer.json 提供支持,这是一种结构化的带有注释 (jsonc) 元数据格式,用于配置容器化环境。

随着生产工作负载容器化的普及,开发容器已广泛应用于 VS Code 之外的场景。为了在任何环境中推广开发容器,已经开始着手 开发容器规范 的工作,它使任何工具中的任何人都可以配置一致的开发环境。开源 devcontainer CLI 充当规范的参考实现。

devcontainer CLI

当 VS Code 和 Codespaces 等工具在用户的项目中检测到 devcontainer.json 文件时,它们使用 CLI 配置开发容器。devcontainer CLI 是一个参考实现,以便单个用户和其他工具可以读取 devcontainer.json 元数据,并从中创建开发容器。

此 CLI 可以直接使用,也可以集成到产品体验中,类似于它目前与 Dev Containers 和 Codespaces 的集成方式。它目前同时支持简单的单容器选项,并与 Docker Compose 集成,以支持多容器场景。

CLI 可在 devcontainers/cli 存储库中获得。

安装

您可以通过 Dev Containers 扩展快速试用 CLI。从命令面板 (F1) 选择 Dev Containers: Install devcontainer CLI 命令。

备用安装

还有其他选项可以在其他地方使用 CLI

  • 安装其 npm 包
  • 使用 GitHub Action 或 Azure DevOps 任务
  • 从源代码构建 CLI 存储库

在此页面上,我们将重点介绍如何使用 npm 包。

npm install

要安装 npm 包,您需要安装 Python、Node.js(版本 14 或更高版本)和 C/C++,以构建一个依赖项。VS Code 如何贡献 wiki 中提供了有关推荐工具集的详细信息。

npm install -g @devcontainers/cli

验证您是否可以运行 CLI 并查看其帮助文本

devcontainer <command>

Commands:
  devcontainer up                   Create and run dev container
  devcontainer build [path]         Build a dev container image
  devcontainer run-user-commands    Run user commands
  devcontainer read-configuration   Read configuration
  devcontainer features             Features commands
  devcontainer templates            Templates commands
  devcontainer exec <cmd> [args..]  Execute a command on a running dev container

Options:
  --help     Show help                                                 [boolean]
  --version  Show version number                                       [boolean]

注意:如果您通过 VS Code 安装了 CLI,则将列出 open 命令以打开您的开发容器。

运行 CLI

拥有 CLI 后,您可以使用示例项目(如 Rust 示例)对其进行试用。

将 Rust 示例克隆到您的机器上,并使用 CLI 的 up 命令启动开发容器

git clone https://github.com/microsoft/vscode-remote-try-rust
devcontainer up --workspace-folder <path-to-vscode-remote-try-rust>

这将从容器注册表下载容器映像,并启动容器。您的 Rust 容器现在应该正在运行

[88 ms] dev-containers-cli 0.1.0.
[165 ms] Start: Run: docker build -f /home/node/vscode-remote-try-rust/.devcontainer/Dockerfile -t vsc-vscode-remote-try-rust-89420ad7399ba74f55921e49cc3ecfd2 --build-arg VARIANT=bullseye /home/node/vscode-remote-try-rust/.devcontainer
[+] Building 0.5s (5/5) FINISHED
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 38B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for mcr.microsoft.com/vscode/devcontainers/r  0.4s
 => CACHED [1/1] FROM mcr.microsoft.com/vscode/devcontainers/rust:1-bulls  0.0s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:39873ccb81e6fb613975e11e37438eee1d49c963a436d  0.0s
 => => naming to docker.io/library/vsc-vscode-remote-try-rust-89420ad7399  0.0s
[1640 ms] Start: Run: docker run --sig-proxy=false -a STDOUT -a STDERR --mount type=bind,source=/home/node/vscode-remote-try-rust,target=/workspaces/vscode-remote-try-rust -l devcontainer.local_folder=/home/node/vscode-remote-try-rust --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --entrypoint /bin/sh vsc-vscode-remote-try-rust-89420ad7399ba74f55921e49cc3ecfd2-uid -c echo Container started
Container started
{"outcome":"success","containerId":"f0a055ff056c1c1bb99cc09930efbf3a0437c54d9b4644695aa23c1d57b4bd11","remoteUser":"vscode","remoteWorkspaceFolder":"/workspaces/vscode-remote-try-rust"}

然后,您可以在此开发容器中运行命令

devcontainer exec --workspace-folder <path-to-vscode-remote-try-rust> cargo run

这将编译并运行 Rust 示例,输出

[33 ms] dev-containers-cli 0.1.0.
   Compiling hello_remote_world v0.1.0 (/workspaces/vscode-remote-try-rust)
    Finished dev [unoptimized + debuginfo] target(s) in 1.06s
     Running `target/debug/hello_remote_world`
Hello, VS Code Dev Containers!
{"outcome":"success"}

上述步骤也提供在 CLI 存储库的 README 中。

自动化

如果您想在 CI/CD 构建或测试自动化中使用 devcontainer CLI,您可以在 devcontainers/ci 存储库中找到 GitHub Actions 和 Azure DevOps 任务的示例。

预构建

devcontainer build 命令允许您快速构建开发容器映像,遵循与 Dev Containers 扩展或 GitHub Codespaces 相同的步骤。当您想要使用 CI 或 DevOps 产品(如 GitHub Actions)预构建开发容器映像时,这将特别有用。

build 接受一个指向包含 .devcontainer 文件夹或 .devcontainer.json 文件的文件夹的路径。例如,devcontainer build --workspace-folder <my_repo> 将为 my_repo 构建容器映像。

构建和发布映像的示例

例如,您可能希望预构建一些映像,然后在多个项目或存储库中重复使用它们。为此,请执行以下步骤

  1. 创建 源代码存储库。

  2. 为每个您想预先构建的镜像创建开发容器配置,并根据您的需求进行自定义(包括 开发容器功能)。例如,考虑以下 devcontainer.json 文件

    {
      "build": {
        "dockerfile": "Dockerfile"
      },
      "features": {
        "ghcr.io/devcontainers/features/docker-in-docker:1": {
          "version": "latest"
        }
      }
    }
    
  3. 使用 devcontainer build 命令构建镜像并将其 推送到 您的镜像仓库。有关镜像命名和身份验证等额外步骤的信息,请参阅您镜像仓库的文档(例如 Azure 容器仓库GitHub 容器仓库Docker Hub)。

    devcontainer build --workspace-folder <my_repo> --push true --image-name <my_image_name>:<optional_image_version>
    

避免使用 Docker 构建的映像出现的问题

鉴于 Dockerfile 和 Docker Compose 文件可以在没有 VS Code 或 devcontainer CLI 的情况下使用,您可能希望让用户知道他们不应该尝试直接构建镜像。您可以在 高级开发容器文档 中了解更多信息。

模板和功能

您可以使用开发容器 CLI 与开发容器 模板功能 进行交互。在创建和使用模板时,您可能希望将其发布给其他人,您可以在 开发容器规范 中了解更多信息。

反馈

开发容器 CLI 和规范正在积极开发中,我们欢迎您的反馈,您可以在 此问题 中提供反馈,或者通过 devcontainers/cli 仓库中的新问题和拉取请求提供反馈。

后续步骤