參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

開發容器 CLI

本主題涵蓋了開發容器命令列介面(dev container CLI),它允許您構建和管理開發容器,並且是開發容器規範的配套工具。

開發容器

一個一致、可預測的環境是高效愉快軟體開發體驗的關鍵。

容器(例如Docker容器)歷來用於在部署時標準化應用程式,但它們在支援其他場景方面也有巨大潛力,包括持續整合 (CI)、測試自動化和全功能編碼環境。開發容器提供了這種工作環境,並確保您的專案擁有所需的工具和軟體,無論是複雜分散式專案還是隻有少數需求的專案。

Diagram comparing dev versus production containers

透過開發容器擴充套件,Visual Studio Code 支援開發容器;透過GitHub Codespaces 也支援開發容器。這種支援由devcontainer.json提供支援,它是一種帶有註釋的結構化 JSON (jsonc) 元資料格式,用於配置容器化環境。

隨著容器化生產工作負載變得普遍,開發容器在 VS Code 以外的場景中也變得廣泛有用。為了在任何環境中推廣開發容器,我們已經開始制定開發容器規範,它使任何人都可以使用任何工具配置一致的開發環境。開源的 dev container CLI 作為該規範的參考實現。

dev container CLI

當 VS Code 和 Codespaces 等工具在使用者的專案中檢測到devcontainer.json檔案時,它們會使用 CLI 來配置開發容器。dev container CLI 是一個參考實現,因此個人使用者和其他工具可以讀取devcontainer.json元資料並從中建立開發容器。

此 CLI 可以直接使用,也可以整合到產品體驗中,類似於它目前與開發容器和 Codespaces 整合的方式。它目前支援簡單的單容器選項,並與Docker Compose整合,用於多容器場景。

CLI 在devcontainers/cli儲存庫中可用。

安裝

您可以透過 Dev Containers 擴充套件快速試用 CLI。從命令面板 (F1) 中選擇Dev Containers: Install devcontainer CLI命令。

備用安裝

在其他地方使用 CLI 還有其他選項

  • 安裝其 npm 包
  • 使用 GitHub Action 或 Azure DevOps Task
  • 從原始碼構建 CLI 儲存庫

在此頁面上,我們將重點介紹如何使用 npm 包。

npm 安裝

要安裝 npm 包,您需要安裝 Python、Node.js(版本 14 或更高版本)和 C/C++ 來構建其中一個依賴項。VS Code How to Contribute 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 構建或測試自動化中使用 dev container CLI,您可以在devcontainers/ci儲存庫中找到 GitHub Actions 和 Azure DevOps Tasks 的示例。

預構建

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 Container RegistryGitHub Container RegistryDocker 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 的情況下使用,您可能需要告知使用者他們不應該嘗試直接構建映象。您可以在高階開發容器文件中瞭解更多資訊。

模板和功能

您可以使用 dev container CLI 處理開發容器模板功能。在建立和使用模板時,您可能希望將其釋出供他人使用,您可以在dev container 規範中瞭解更多資訊。

反饋

dev container CLI 和規範正在積極開發中,我們歡迎您的反饋。您可以透過此問題或透過devcontainers/cli儲存庫中的新問題和拉取請求提供反饋。

後續步驟