現已釋出!閱讀關於 11 月新增功能和修復的內容。

在容器內開發

Visual Studio Code Dev Containers 擴充套件允許你將容器用作功能齊全的開發環境。它允許你在容器內(或掛載到容器內)開啟任何資料夾,並利用 Visual Studio Code 的全部功能。專案中的 devcontainer.json 檔案 會告訴 VS Code 如何訪問(或建立)一個具有明確定義的工具和執行時堆疊的開發容器。此容器可用於執行應用程式,或用於隔離處理程式碼庫所需的工具、庫或執行時。

工作區檔案從本地檔案系統掛載,或複製/克隆到容器中。擴充套件程式在容器內安裝和執行,在那裡它們可以完全訪問工具、平臺和檔案系統。這意味著你只需連線到不同的容器,即可無縫切換整個開發環境。

Container Architecture

這使得 VS Code 能夠提供本地質量的開發體驗,包括完整的 IntelliSense(補全)、程式碼導航和除錯,無論你的工具(或程式碼)位於何處

Dev Containers 擴充套件支援兩種主要的操作模式

注意:Dev Containers 擴充套件支援開放的 Dev Containers 規範,該規範使任何人在任何工具中都能配置一致的開發環境。你可以在我們的開發容器 FAQ 和該規範的網站 containers.dev 上了解更多資訊。

入門

注意:你可以在入門開發容器教程中瞭解如何快速上手和執行開發容器。

系統要求

本地/遠端主機

你可以透過多種方式使用帶有 Dev Containers 擴充套件的 Docker,包括

  • 本地安裝 Docker。
  • 在遠端環境中安裝了 Docker。
  • 其他符合 Docker 標準的 CLI,安裝在本地或遠端。

你可以在替代 Docker 選項文件中瞭解更多資訊。

以下是配置本地或遠端主機上 Docker 的一些具體方法

  • Windows: Windows 10 Pro/Enterprise 上的 Docker Desktop 2.0+。Windows 10 Home (2004+) 需要 Docker Desktop 2.3+ 和 WSL 2 後端。(不支援 Docker Toolbox。不支援 Windows 容器映象。)
  • macOSDocker 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. 安裝 Docker Desktop for Windows/Mac

    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. 安裝 Dev Containers 擴充套件。如果你計劃在 VS Code 中使用其他遠端擴充套件,可以選擇安裝 Remote Development 擴充套件包

使用 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: Open Folder in Container...命令,然後選擇你想為其設定容器的專案資料夾。

    提示: 如果你想在開啟資料夾之前編輯容器的內容或設定,可以改用Dev Containers: Add Dev Container Configuration Files...

    Quick actions Status bar item

  2. 現在,為你的開發容器選擇一個起點。你可以從可過濾列表中選擇一個開發容器模板,或者使用資料夾中存在的現有 DockerfileDocker Compose 檔案(如果存在)。

    注意: 當使用 Alpine Linux 容器時,某些擴充套件可能無法工作,因為擴充套件內部的原生代碼存在 glibc 依賴項。

    Select a node Dev Container Template

    列表將根據你開啟的資料夾內容自動排序。

    你可能可以使用其他功能來定製你的開發容器,你可以在下面瞭解更多關於這些功能的資訊

    顯示的開發容器模板來自我們的第一方和社群索引,這是Dev Container 規範的一部分。我們在該規範中託管了一組模板,位於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 資料夾到容器中

如果你正在使用Windows Subsystem for Linux v2 (WSL 2)啟用了 Docker Desktop 的 WSL 2 後端,你就可以處理儲存在 WSL 中的原始碼了!

啟用 WSL 2 引擎後,你可以選擇:

  • 使用命令面板(F1)或快速操作執行Dev Containers: Reopen in Container 命令,以開啟已使用WSL 擴充套件開啟的資料夾。
  • 從命令面板(F1)選擇Dev Containers: Open Folder in Container...,然後使用本地 \\wsl$ 共享(從 Windows 端)選擇一個 WSL 資料夾。

其餘快速入門指南按原樣適用!你可以在WSL 擴充套件文件中瞭解更多關於WSL 擴充套件的資訊。

在容器中開啟遠端 SSH 主機上的資料夾

如果你使用的是 Linux 或 macOS SSH 主機,你可以同時使用Remote - SSH 和 Dev Containers 擴充套件。你甚至不需要在本地安裝 Docker 客戶端。

操作步驟如下:

  1. 按照 Remote - SSH 擴充套件的安裝和 SSH 主機設定步驟進行操作。
  2. 可選: 設定 SSH 基於金鑰的身份驗證到伺服器,這樣你就不需要多次輸入密碼。
  3. 在 SSH 主機上安裝 Docker。你不需要在本地安裝 Docker。
  4. 按照 Remote - SSH 擴充套件的快速入門連線到主機並在那裡開啟一個資料夾。
  5. 從命令面板(F1⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 開發容器:在容器中重新開啟 命令。

Dev Containers 快速入門指南的其餘部分按原樣適用。你可以在Remote - SSH 擴充套件文件中瞭解更多關於Remote - SSH 擴充套件的資訊。如果此模型不滿足你的需求,你還可以參閱在遠端 Docker 主機上開發文章瞭解其他選項。

在容器中開啟遠端 Tunnel 主機上的資料夾

你可以同時使用Remote - Tunnels 和 Dev Containers 擴充套件,在你的遠端主機上將一個資料夾在容器內開啟。你甚至不需要在本地安裝 Docker 客戶端。這與上面的 SSH 主機場景類似,但使用的是 Remote - Tunnels。

操作步驟如下:

  1. 按照 Remote - Tunnels 擴充套件的入門說明進行操作。
  2. 在 Tunnel 主機上安裝 Docker。你不需要在本地安裝 Docker。
  3. 按照 Remote - Tunnels 擴充套件的步驟連線到 Tunnel 主機並在那裡開啟一個資料夾。
  4. 從命令面板(F1⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 開發容器:在容器中重新開啟 命令。

Dev Containers 快速入門指南的其餘部分按原樣適用。你可以在Remote - Tunnels 擴充套件文件中瞭解更多關於Remote - Tunnels 擴充套件的資訊。如果此模型不滿足你的需求,你還可以參閱在遠端 Docker 主機上開發文章瞭解其他選項。

在容器中開啟現有工作區

你也可以遵循類似的過程,在單個容器中開啟一個 VS Code 多根工作區,前提是該工作區僅引用相對於 .code-workspace 檔案所在資料夾(或資料夾本身)的子資料夾的路徑。

你可以選擇:

  • 使用Dev Containers: Open Workspace in Container...命令。
  • 在容器中開啟包含 .code-workspace 檔案的資料夾後,使用檔案 > 開啟工作區...

連線後,你可能需要將 .devcontainer 資料夾新增到工作區,以便在它不那麼容易顯示時輕鬆編輯其內容。

另外請注意,雖然你不能在同一個 VS Code 視窗中使用多個容器處理同一個工作區,但你可以從不同的視窗同時使用多個 Docker Compose 管理的容器

快速入門:在隔離的容器卷中開啟 Git 倉庫或 GitHub PR

雖然你可以在容器中開啟本地克隆的倉庫,但你可能想使用倉庫的隔離副本進行 PR 審查或調查其他分支,而不影響你的工作。

倉庫容器使用隔離的本地 Docker 卷,而不是繫結到本地檔案系統。除了不會弄亂你的檔案樹之外,本地卷在 Windows 和 macOS 上還具有提高效能的優點。(有關在此類場景中使用這些型別卷的資訊,請參閱高階配置提高磁碟效能文章。)

例如,請按照以下步驟在倉庫容器中開啟一個“try”倉庫

  1. 啟動 VS Code,從命令面板(F1)執行Dev Containers: Clone Repository in Container Volume...命令。

  2. 在出現的輸入框中輸入 microsoft/vscode-remote-try-node(或其他“try”倉庫)、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

    列表將根據你開啟的資料夾內容自動排序。顯示的開發容器模板來自我們的第一方和社群索引,這是Dev Container 規範的一部分。我們在該規範中託管了一組模板,位於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 構建錯誤等原因未能啟動,你可以在出現的對話方塊中選擇Reopen in Recovery Container(在恢復容器中重新開啟),進入一個“恢復容器”,讓你編輯 Dockerfile 或其他內容。這會以一個最小的容器開啟帶有克隆倉庫的 Docker 卷,並顯示建立日誌。修復完成後,使用Reopen in Container(在容器中重新開啟)重試。

提示: 想使用遠端 Docker 主機?請參閱在容器中開啟遠端 SSH 主機上的資料夾部分以獲取資訊。

信任你的工作區

Visual Studio Code 非常重視安全性,並希望幫助你安全地瀏覽和編輯程式碼,無論其來源或原始作者是誰。工作區信任功能允許你決定你的專案資料夾是否應允許或限制自動程式碼執行。

Dev Containers 擴充套件已採用工作區信任。根據你開啟和與原始碼互動的方式,你將在不同時間點被提示決定是否信任你正在編輯或執行的程式碼。

在容器中重新開啟資料夾

為現有專案設定開發容器需要信任本地(或 WSL)資料夾。在視窗重新載入之前,系統會要求你信任本地(或 WSL)資料夾。

此流程有幾個例外情況

  1. 單擊最近的條目時。
  2. 使用Open Folder in Container(在容器中開啟資料夾)命令會在視窗重新載入後詢問信任,如果尚未授予信任。

附加到現有容器

附加到現有容器時,系統會要求你確認附加意味著你信任該容器。這隻會確認一次。

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)選擇Dev Containers: Add Dev Container Configuration Files...(新增開發容器配置檔案...)命令,將所需檔案作為起點新增到你的專案中,你可以根據需要進一步自定義。該命令允許你根據資料夾內容從列表中選擇預定義的容器配置,重用現有的 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”(功能)是獨立的、可共享的安裝程式碼和開發容器配置單元。其名稱來源於這樣一種理念:引用其中一個功能可以讓你快速輕鬆地將更多工具、執行時或庫“Features”新增到你的開發容器中,供你或你的協作者使用。

當你使用Dev Containers: Add Dev Container Configuration Files(新增開發容器配置檔案)時,你會看到一個指令碼列表,用於自定義現有的開發容器配置,例如安裝 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

Dev Containers: Configure Container Features(配置容器功能)命令允許你更新現有配置。

VS Code UI 中使用的功能現在來自一箇中央索引,你也可以為其做出貢獻。請參閱Dev Containers 規範網站以獲取當前列表,並瞭解如何釋出和分發 Features

“始終安裝”的功能

與你可以設定始終在開發容器中安裝的擴充套件類似,你可以使用使用者設定的dev.containers.defaultFeatures 設定來設定你始終希望安裝的功能。

"dev.containers.defaultFeatures": {
    "ghcr.io/devcontainers/features/github-cli:1": {}
},

建立你自己的功能

建立和釋出你自己的 Dev Container Features 也非常容易。已釋出的 Features 可以作為 OCI Artifacts 儲存和共享,來自任何支援的公共或私有容器登錄檔。你可以在 containers.dev 上檢視當前已釋出 Features 的列表。

一個 Feature 是一個自包含的實體,位於一個資料夾中,至少包含一個 devcontainer-feature.json 和一個 install.sh 入口點指令碼。

+-- feature
|    +-- devcontainer-feature.json
|    +-- install.sh
|    +-- (other files)

檢視 feature/starter 倉庫,瞭解如何使用開發容器 CLI 釋出你自己的公共或私有 Features。

Features 規範和分發

Features 是開源開發容器規範的關鍵部分。你可以檢視有關 Features 如何工作的更多資訊及其分發

預構建開發容器映象

我們建議預先構建包含所需工具的映象,而不是每次在開發容器中開啟專案時都建立和構建容器映象。使用預構建的映象將加快容器啟動速度,簡化配置,並允許你固定特定版本的工具以提高供應鏈安全性並避免潛在的中斷。你可以透過安排使用 DevOps 或持續整合(CI)服務(如 GitHub Actions)來自動預構建映象。

更好的是——預構建的映象可以包含 Dev Container 元資料,因此當你引用一個映象時,設定將自動被拉取。

我們建議使用Dev Container CLI(或其他支援規範的實用程式,如GitHub Action)來預構建映象,因為它與 Dev Containers 擴充套件的最新功能保持同步——包括開發容器 Features。構建完映象後,你可以將其推送到容器登錄檔(如Azure Container RegistryGitHub Container RegistryDocker Hub)並直接引用它。

你可以使用 devcontainers/ci 倉庫中的 GitHub Action 來幫助你在工作流中重用開發容器。

有關預構建映象的更多資訊,請轉到開發容器 CLI 文章

繼承元資料

你可以透過映象標籤將 Dev Container 配置和 Feature 元資料包含在預構建映象中。這使得映象成為自包含的,因為在引用映象時,這些設定會自動被拾取——無論是直接引用,在引用的 Dockerfile 中使用 FROM,還是在 Docker Compose 檔案中。這有助於防止你的 Dev Container 配置和映象內容不同步,並允許你透過簡單的映象引用將同一配置的更新推送到多個倉庫。

此元資料標籤會在您使用 Dev Container CLI(或其他支援 規範 的實用工具,例如 GitHub ActionAzure DevOps task)進行預構建時自動新增,其中包含 devcontainer.json 中的設定以及任何引用的 Dev Container Features。

這允許您有一個單獨的更復雜的 devcontainer.json 用於預構建您的映象,然後在您的一個或多個儲存庫中使用一個大大簡化過的。映象的內容將在您建立容器時與此簡化的 devcontainer.json 內容合併(有關合並邏輯的資訊,請參閱 規範)。但最簡單的情況是,您可以在 devcontainer.json 中直接引用映象,以使設定生效。

{
  "image": "mcr.microsoft.com/devcontainers/go:1"
}

請注意,您也可以選擇手動將元資料新增到映象標籤。即使您沒有使用 Dev Container 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 部分。您可以右鍵單擊卷以檢查其建立資訊,例如卷的建立時間、克隆到其中的儲存庫以及掛載點。您也可以在 dev container 中探索它。

Right-click dev volumes in Remote Explorer

如果您安裝了 Container Tools 擴充套件,您可以在Container ExplorerVolumes部分右鍵單擊一個卷,然後選擇Explore in a Development Container

Explore in dev container in Container Tools 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}(在 Dev Container 中安裝本地擴充套件:{名稱})來將所有本地安裝的擴充套件安裝到 Dev Container 中,方法是單擊Local - Installed(本地 - 已安裝)標題欄右側的雲按鈕。這將顯示一個下拉選單,您可以在其中選擇要在容器中安裝的本地擴充套件。

Install all extensions

但是,某些擴充套件可能需要您在容器中安裝其他軟體。如果您遇到問題,請查閱擴充套件文件瞭解詳情。

將擴充套件新增到 devcontainer.json

雖然您可以手動編輯您的 devcontainer.json 檔案來新增擴充套件 ID 列表,但您也可以在“擴充套件”檢視中右鍵單擊任何擴充套件,然後選擇Add to devcontainer.json(新增到 devcontainer.json)。

Add to devcontainer.json menu

選擇不安裝擴充套件

如果基礎映象或 Feature 配置了您不想在 dev container 中安裝的擴充套件,您可以透過在列表中新增擴充套件並加上減號來選擇不安裝。例如

{
  "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 檔案中強制它在特定位置執行。

例如,以下設定將強制 Container Tools 擴充套件在本地執行,以及 Remote - SSH: Editing Configuration Files 擴充套件在遠端執行,而不是使用它們的預設設定:

"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 a Port(轉發埠)命令,在會話期間臨時轉發一個新埠。

Forward port input

選擇埠後,通知將告訴您應該使用哪個 localhost 埠來訪問容器中的埠。例如,如果您轉發了一個監聽在埠 3000 的 HTTP 伺服器,通知可能會告訴您它已對映到 localhost 的埠 4123。然後您可以使用 https://:4123 連線到此遠端 HTTP 伺服器。

如果您稍後需要訪問,可以在遠端資源管理器中找到相同的轉發埠資訊,位於Forwarded Ports(轉發的埠)部分。

如果您希望 VS Code 記住您轉發的任何埠,請在設定編輯器中勾選Remote: Restore Forwarded Ports(遠端:恢復轉發的埠)(⌘, (Windows, Linux Ctrl+,)),或者在 settings.json 中將 "remote.restoreForwardedPorts": true 設定為 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(Dev Containers:重新構建容器)命令來完成此操作。

開啟終端

從 VS Code 在容器中開啟終端非常簡單。一旦您在容器中打開了一個資料夾,您在 VS Code 中開啟的任何終端視窗Terminal > New Terminal - 終端 > 新終端)都將自動在容器中執行,而不是在本地執行。

您也可以從此終端視窗使用 code 命令列執行許多操作,例如在容器中開啟新檔案或資料夾。輸入 code --help 以瞭解命令列可用的選項。

Using the code CLI

在容器中除錯

一旦您在容器中打開了一個資料夾,您就可以像在本地執行應用程式一樣使用 VS Code 的偵錯程式。例如,如果您在 launch.json 中選擇了一個啟動配置並開始除錯(F5),應用程式將在遠端主機上啟動並附加偵錯程式。

有關在 .vscode/launch.json 中配置 VS Code 除錯功能的詳細資訊,請參閱除錯文件。

特定於容器的設定

當您連線到 dev container 時,VS Code 的本地使用者設定也會被重用。雖然這保持了您的使用者體驗一致,但您可能希望在本地計算機和每個容器之間更改其中一些設定。幸運的是,一旦您連線到容器,您還可以透過在命令面板(F1)中執行Preferences: Open Remote Settings(首選項:開啟遠端設定)命令,或在設定編輯器中選擇Remote(遠端)選項卡來設定特定於容器的設定。當您連線到容器時,這些設定將覆蓋您已有的任何本地設定。

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"
        }
    }
}

由於這只是建立了預設值,您仍然可以在容器建立後根據需要更改設定。

管理容器

預設情況下,Dev Containers 擴充套件會在您開啟資料夾時自動啟動 devcontainer.json 中提到的容器。當您關閉 VS Code 時,該擴充套件會自動關閉您已連線的容器。您可以透過向 devcontainer.json 新增 "shutdownAction": "none" 來更改此行為。

雖然您可以使用命令列管理容器,但您也可以使用Remote Explorer(遠端資源管理器)。要停止容器,請從下拉選單中選擇 Containers(容器)(如果存在),右鍵單擊正在執行的容器,然後選擇Stop Container(停止容器)。您還可以啟動已退出的容器、刪除容器以及刪除最近的資料夾。從詳細資訊檢視中,您可以轉發埠並在瀏覽器中開啟已轉發的埠。

Containers Explorer screenshot

如果您想清理映象或批次刪除容器,請參閱 清理未使用的容器和映象 以獲取不同選項。

使用點檔案倉庫進行個性化

點檔案(Dotfiles)是以點(.)開頭的檔名,通常包含各種應用程式的配置檔案。由於開發容器可以覆蓋各種應用程式型別,因此將這些檔案儲存在某個地方會很有用,以便在容器啟動並執行時輕鬆將它們複製到容器中。

一種常見的方法是將這些點檔案儲存在 GitHub 儲存庫中,然後使用實用工具進行克隆和應用。Dev Containers 擴充套件內建了支援,可以與您自己的容器一起使用。如果您不熟悉這個概念,可以檢視各種現有的 點檔案啟動儲存庫

要使用它,請將您的點檔案 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"
}

從現在開始,每當建立容器時,都會使用該點檔案儲存庫。

已知限制

Dev Containers 的限制

  • 不支援 Windows 容器映象。
  • 多根工作區中的所有根/資料夾都將在同一容器中開啟,無論較低級別是否存在配置檔案。
  • 不支援 Linux 上非官方的 Ubuntu Docker snap 包。請按照您分發版的官方 Docker 安裝說明進行操作。
  • 不支援 Windows 上的 Docker Toolbox。
  • 如果你使用 SSH 克隆 Git 倉庫,並且你的 SSH 金鑰有密碼短語,VS Code 的拉取和同步功能在遠端執行時可能會掛起。請使用不帶密碼短語的 SSH 金鑰,使用 HTTPS 克隆,或者從命令列執行 git push 來解決此問題。
  • 容器中的本地代理設定不會被重用,這可能會阻止擴充套件正常工作,除非配置了適當的代理資訊(例如,具有適當代理資訊的全域性 HTTP_PROXYHTTPS_PROXY 環境變數)。
  • 當 OpenSSH 在 Windows 上的版本小於等於 8.8 並且 ssh-agent 執行時,以及 SSH 客戶端(在任何平臺上)的版本大於等於 8.9 時,存在一個不相容性。解決方法是將 Windows 上的 OpenSSH 升級到 8.9 或更高版本,可以使用 winget 或從 Win32-OpenSSH/releases 下載安裝程式。(請注意,ssh-add -l 會正常工作,但 ssh <ssh-server> 會因 <ssh-server>: Permission denied (publickey) 而失敗。這也影響了使用 SSH 連線到儲存庫的 Git。)

有關容器相關的活動問題列表,請參閱 此處

Docker 限制

有關更多資訊,請參閱 Windows 或 Mac 的 Docker 故障排除指南:WindowsMac

容器工具擴充套件限制

如果您正在從 WSL、Remote - Tunnels 或 Remote - SSH 視窗使用 Container Tools 或 Kubernetes 擴充套件,在 Container Explorer 或 Kubernetes 檢視中使用Attach Visual Studio Code(附加 Visual Studio Code)上下文選單操作時,會要求再次選擇可用的容器。

擴充套件限制

此時,大多數擴充套件都可以在 Dev Containers 中正常工作,無需修改。但是,在某些情況下,某些功能可能需要進行更改。如果您遇到擴充套件問題,請參閱此處,其中彙總了常見問題和解決方案,您在報告問題時可以提及給擴充套件作者。

此外,儘管 Alpine 支援可用,但由於擴充套件內部原生程式碼中的 glibc 依賴關係,某些安裝在容器中的擴充套件可能無法正常工作。有關詳細資訊,請參閱 Linux 遠端開發文章。

高階容器配置

有關以下主題的資訊,請參閱 高階容器配置文章:

devcontainer.json 參考

有一個完整的 devcontainer.json 參考,您可以在其中檢視檔案模式,以幫助您自定義開發容器並控制如何附加到正在執行的容器。

問題或反饋

故障排除

無法寫入檔案(NoPermissions (FileSystemError))

在以下配置中執行 dev container 時,您可能會遇到此問題:

  • Docker Desktop 使用 Windows Subsystem for Linux (WSL) 後端執行
  • 已啟用增強型容器隔離 (ECI)

請檢視 issue #8278 以獲取可能的解決方法。

後續步驟

© . This site is unofficial and not affiliated with Microsoft.