在容器中進行開發

Visual Studio Code Dev Containers 擴充功能讓您可以使用容器作為功能完整的開發環境。它允許您在容器內(或掛載到容器中)開啟任何資料夾,並充分利用 Visual Studio Code 的完整功能集。專案中的 devcontainer.json 檔案會告訴 VS Code 如何存取(或建立)具有明確定義工具和執行階段堆疊的開發容器。此容器可用於執行應用程式,或隔離處理程式碼庫所需的工具、程式庫或執行階段。

工作區檔案會從本機檔案系統掛載,或複製/複製 (clone) 到容器中。擴充功能會在容器內安裝並執行,它們可以完全存取工具、平台和檔案系統。這意味著您只需連接到不同的容器,即可順暢地切換整個開發環境。

Container Architecture

這讓 VS Code 能夠提供本機品質的開發體驗,包括完整的 IntelliSense(自動完成)、程式碼導覽和偵錯功能,無論您的工具(或程式碼)位於何處

Dev Containers 擴充功能支援兩種主要的操作模型

注意:Dev Containers 擴充功能支援開放的 Dev Containers 規範,該規範賦予任何工具的使用者配置一致開發環境的能力。您可以在我們的 開發容器常見問題集 (FAQ) 以及規範網站 containers.dev 上了解更多資訊。

入門指南

注意:您可以透過入門的 Dev Containers 教學課程了解如何快速開始使用開發容器。

系統需求

本機 / 遠端主機

您可以透過幾種方式將 Docker 與 Dev Containers 擴充功能搭配使用,包括

  • 安裝於本機的 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 容器映像檔。)
  • 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. 安裝 Docker Desktop for Windows/Mac

    2. 如果您在 Windows 上使用 WSL 2,請確保已啟用 WSL 2 後端:在工作列的 Docker 圖示上按右鍵並選擇設定 (Settings)。勾選 Use the WSL 2 based engine,並確認您的發行版已在 Resources > WSL Integration 下啟用。

    3. 如果不使用 WSL 2 後端,請在工作列的 Docker 圖示上按右鍵,選擇 Settings,並更新 Resources > File Sharing 以包含存放原始碼的所有位置。請參閱秘訣與技巧以進行疑難排解。

    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 認證管理員 (credential manager) 進行 clone,您的容器應該已經可以存取您的憑證!如果您使用 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. 現在為您的開發容器選擇一個起點。您可以從可篩選的清單中選擇一個基本的開發容器範本 (Dev Container Template),或者如果選定的資料夾中已存在 DockerfileDocker Compose 檔案,則可以使用現有的檔案。

    注意:使用 Alpine Linux 容器時,某些擴充功能可能因擴充功能內的原生程式碼依賴 glibc 而無法運作。

    Select a node Dev Container Template

    該清單將會根據您開啟的資料夾內容自動排序。

    您可能可以使用額外的「功能 (Features)」來自訂您的開發容器,您可以在下方閱讀更多相關資訊

    所顯示的開發容器範本來自我們第一方和社群索引,這是 Dev Container 規範的一部分。我們在 devcontainers/templates 儲存庫中託管了一組作為規範一部分的範本。您可以瀏覽該儲存庫的 src 資料夾來查看每個範本的內容。

    您也可以選擇使用 dev container CLI 來發佈和散發您自己的開發容器範本。

  3. 選擇容器的起點後,VS Code 會將開發容器設定檔案加入您的專案中 (.devcontainer/devcontainer.json)。

  4. VS Code 視窗將重新載入並開始建置開發容器。進度通知會提供狀態更新。您只需在第一次開啟時建置開發容器;在第一次成功建置後再次開啟該資料夾會快得多。

    Dev Container Progress Notification

  5. 建置完成後,VS Code 會自動連接到容器。

現在,您可以像在本機開啟專案一樣,在 VS Code 中與您的專案互動。從現在起,當您開啟專案資料夾時,VS Code 將自動擷取並重複使用您的開發容器設定。

秘訣: 想要使用遠端 Docker 主機嗎?請參閱在遠端 SSH 主機的容器中開啟資料夾章節以獲取相關資訊。

雖然使用這種綁定掛載 (bind mount) 將本機檔案系統掛載到容器中的方法很方便,但它在 Windows 和 macOS 上會有一定的效能開銷。您可以使用一些技術來改善磁碟效能,或者改為使用隔離的容器儲存體在容器中開啟儲存庫

在 Windows 上的容器中開啟 WSL 2 資料夾

如果您使用的是 Windows Subsystem for Linux v2 (WSL 2) 並已啟用 Docker Desktop 的 WSL 2 後端,則可以處理儲存在 WSL 內部的原始碼!

一旦啟用 WSL 2 引擎,您可以選擇

  • 從已經使用 WSL 擴充功能開啟的資料夾中,使用 Dev Containers: Reopen in Container 指令。
  • 從命令選擇區 (F1) 選擇 Dev Containers: Open Folder in Container...,並使用本機 \\wsl$ 共用路徑(從 Windows 端)選擇一個 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. 使用命令面板中的 Dev Containers: Reopen in Container 指令(F1⇧⌘P)。

其餘的 Dev Containers 快速入門步驟完全適用。您可以透過其說明文件了解更多關於 Remote - SSH 擴充功能的資訊。如果此模型無法滿足您的需求,您也可以參閱在遠端 Docker 主機上進行開發文章以查看其他選項。

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

您可以同時使用 Remote - Tunnels 和 Dev Containers 擴充功能,在容器內開啟遠端主機上的資料夾。您甚至不需要在本機安裝 Docker 用戶端。這與上述的 SSH 主機場景類似,但使用的是 Remote - Tunnels。

執行方式如下:

  1. 請遵循 Remote - Tunnels 擴充功能的入門說明。
  2. 在您的 Tunnel 主機上安裝 Docker。您無需在本機安裝 Docker。
  3. 遵循 Remote - Tunnels 擴充功能的步驟以連接到 Tunnel 主機並在其中開啟資料夾。
  4. 使用命令面板中的 Dev Containers: Reopen in Container 指令(F1⇧⌘P)。

其餘的 Dev Containers 快速入門步驟完全適用。您可以透過其說明文件了解更多關於 Remote - Tunnels 擴充功能的資訊。如果此模型無法滿足您的需求,您也可以參閱在遠端 Docker 主機上進行開發文章以查看其他選項。

在容器中開啟現有工作區

如果您要開啟的 VS Code 多根工作區 (multi-root workspace)參照了 .code-workspace 檔案所在資料夾(或該資料夾本身)的子資料夾的相對路徑,您也可以按照類似的流程在單一容器中開啟它。

您可以選擇

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

連接後,若 .devcontainer 資料夾尚未顯示,您可能需要將其加入工作區,以便輕鬆編輯其內容。

同時請注意,雖然您無法在同一個 VS Code 視窗中為同一個工作區使用多個容器,但您可以在不同的視窗中使用同時由 Docker Compose 管理的多個容器

快速入門:在隔離的容器儲存體中開啟 Git 儲存庫或 GitHub PR

雖然您可以在容器中開啟本機複製的儲存庫,但您可能希望在隔離的儲存庫副本中進行 PR 審查或研究其他分支,而不影響您的正常工作。

儲存庫容器使用隔離的本機 Docker 儲存體 (volumes),而不是綁定到本機檔案系統。除了不會污染您的檔案樹之外,本機儲存體在 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 代理程式 (agent)。請參閱與容器共用 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 Pull Request URL,該 PR 將會自動被 checkout,並且 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 非常重視安全性,並希望無論程式碼來源或原始作者是誰,都能協助您安全地瀏覽和編輯程式碼。工作區信任 (Workspace Trust) 功能讓您可以決定專案資料夾是否應該允許或限制自動執行程式碼。

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

檢查儲存體

檢查儲存體會從限制模式 (Restricted Mode) 開始,您可以選擇信任容器內的資料夾。

Docker 守護程序在遠端執行

這意味著信任執行 Docker 守護程式的機器。沒有額外的確認提示(僅包含上述針對本機/WSL 案例的提示)。

建立 devcontainer.json 檔案

VS Code 的容器設定儲存在 devcontainer.json 檔案中。此檔案類似於用於偵錯設定的 launch.json 檔案,但它是用於啟動(或附加到)您的開發容器。您也可以指定在容器執行後要安裝的任何擴充功能,或指定用於準備環境的建立後指令 (post-create commands)。開發容器設定位於 .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 檔案,請參閱建立開發容器

開發容器功能 (Dev Container 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 規範網站以獲取目前清單,並學習如何發佈和散發功能

"自動安裝" 功能

類似於您可以設定自動安裝擴充功能的方式,您可以使用 dev.containers.defaultFeatures 在 VS Code 中開啟 在 VS Code Insiders 中開啟 使用者設定來設定您希望永遠安裝的功能

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

建立您自己的功能

建立和發佈您自己的開發容器功能也很容易。已發佈的功能可以作為 OCI Artifacts 從任何支援的公共或私人容器登錄庫儲存和共用。您可以在 containers.dev 上查看目前已發佈的功能清單。

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

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

請查看 feature/starter 儲存庫,以獲取有關使用 dev container CLI 發佈您自己公共或私人功能的說明。

功能規範與散發

功能是開放原始碼 開發容器規範 的關鍵部分。您可以查看關於功能如何運作的更多資訊及其散發方式

預先建置開發容器映像檔

我們建議使用您需要的工具預先建置映像檔,而不是每次在開發容器中開啟專案時都建立並建置容器映像檔。使用預先建置的映像檔將會縮短容器啟動時間、簡化設定,並允許您鎖定工具的特定版本,以提升供應鏈安全並避免潛在的中斷。您可以透過使用 DevOps 或持續整合 (CI) 服務(如 GitHub Actions)排程建置,來自動化預先建置您的映像檔。

更好的是 - 預先建置的映像檔可以包含開發容器中繼資料,因此當您參照映像檔時,設定將會自動提取。

我們建議使用 Dev Container CLI(或其他規範支援的公用程式,例如 GitHub Action)來預先建置您的映像檔,因為它與 Dev Containers 擴充功能的最新功能保持同步 - 包括 開發容器功能。一旦建置了映像檔,您就可以將其推送到容器登錄庫(例如 Azure Container RegistryGitHub Container RegistryDocker Hub)並直接參照它。

您可以使用 devcontainers/ci 儲存庫中的 GitHub Action 來協助您在工作流程中重複使用開發容器。

請前往 關於預先建置映像檔的 dev container CLI 文章以獲取更多資訊。

繼承中繼資料

您可以透過 映像檔標籤 (image labels) 將開發容器設定和功能中繼資料包含在預先建置的映像檔中。這使得映像檔成為獨立的,因為無論是直接參照、在參照的 Dockerfile 中的 FROM 指令中,還是以 Docker Compose 檔案形式參照,這些設定都會在參照映像檔時自動被拾取。這有助於防止您的開發容器設定和映像檔內容不同步,並允許您透過簡單的映像檔參照將相同設定的更新推送到多個儲存庫。

當您使用 Dev Container CLI(或其他規範支援的公用程式,例如 GitHub ActionAzure DevOps 工作)進行預先建置時,此中繼資料標籤會自動加入,並包含來自 devcontainer.json 和任何參照的開發容器功能的設定。

這允許您擁有一個單獨的、更複雜的 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" \
}]'

檢查儲存體 (Volumes)

有時您可能會遇到使用 Docker 具名儲存體 (named volume) 的情況,您需要檢查其中的內容或進行更改。您可以選擇命令選擇區 (F1) 中的 Dev Containers: Explore a Volume in a Dev Container...,無需建立或修改 devcontainer.json 檔案即可使用 VS Code 處理這些內容。

您也可以在遠端總管 (Remote Explorer) 中檢查您的儲存體。確保您已在下拉式選單中選擇 Containers,然後您會注意到一個 Dev Volumes 章節。您可以右鍵點選一個儲存體來檢查其建立資訊,例如儲存體是何時建立的、什麼儲存庫被複製到其中,以及掛載點。您也可以在開發容器中探索它。

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

您也可以透過「擴充功能」檢視,並選擇 Local - Installed 標題列右側的雲端按鈕,選擇 Install Local Extensions in Dev Container: {Name},將所有本機安裝的擴充功能安裝到開發容器中。這將顯示一個下拉式選單,供您選擇要安裝到容器中的本機擴充功能。

Install all extensions

然而,某些擴充功能可能需要您在容器中安裝額外的軟體。如果您遇到問題,請參閱擴充功能說明文件以取得詳細資訊。

將擴充功能加入 devcontainer.json

雖然您可以手動編輯 devcontainer.json 檔案來加入擴充功能 ID 清單,但您也可以在「擴充功能」檢視中對任何擴充功能按右鍵,並選擇 Add to 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 在 VS Code 中開啟 在 VS Code Insiders 中開啟 使用者設定。例如,如果您想安裝 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" ]
}

"workspace" 改為 "ui" 將會強制擴充功能改為在本機 UI/用戶端側執行。除非擴充功能說明文件中另有說明,否則這通常僅應用於測試,因為它可能會導致擴充功能崩潰。詳情請參閱關於首選擴充功能位置的章節。

轉發或發佈連接埠

容器是獨立的環境,因此如果您想存取容器內的伺服器、服務或其他資源,您需要「轉發 (forward)」或「發佈 (publish)」該連接埠到您的主機。您可以設定容器始終暴露這些連接埠,或僅暫時轉發它們。

始終轉發連接埠

透過在 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

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 指令來執行此操作。

開啟終端機

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

您也可以從同一個終端機視窗使用 code 命令列來執行多項操作,例如在容器中開啟新檔案或資料夾。輸入 code --help 以了解命令列有哪些可用選項。

Using the code CLI

在容器中進行偵錯

一旦在容器中開啟了資料夾,您就可以像在本機執行應用程式一樣使用 VS Code 的偵錯工具。例如,如果您在 launch.json 中選擇了啟動設定並開始偵錯 (F5),應用程式將在遠端主機上啟動,並且偵錯工具將附加到它上面。

關於在 .vscode/launch.json 中設定 VS Code 偵錯功能的詳細資訊,請參閱偵錯文件。

容器特定設定

當您連接到開發容器時,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

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

使用 dotfile 儲存庫進行個人化設定

Dotfiles 是檔名以點 (.) 開頭的檔案,通常包含各種應用程式的設定資訊。由於開發容器可以涵蓋各種類型的應用程式,因此將這些檔案儲存在某處會很有幫助,以便在容器啟動並執行後輕鬆將其複製到容器中。

一種常見的方法是將這些 dotfiles 儲存在 GitHub 儲存庫中,然後使用工具程式來複製並應用它們。Dev Containers 擴充功能內建支援將這些檔案與您自己的容器搭配使用。如果您是第一次接觸這個概念,請看看現有的不同 dotfiles 引導儲存庫 (bootstrap repositories)

若要使用此功能,請將您的 dotfiles 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"
}

從現在起,每當建立容器時,都會使用該 dotfiles 儲存庫。

已知限制

Dev Containers 限制
  • 支援 Windows 容器映像檔。
  • 多根工作區中的所有根目錄/資料夾都將在同一個容器中開啟,無論下層是否有設定檔案。
  • 支援 Linux 的非官方 Ubuntu Docker snap 套件。請遵循適用於您發行版的 Docker 官方安裝說明
  • 不支援 Windows 上的 Docker Toolbox。
  • 如果您使用 SSH 複製 Git 儲存庫,且您的 SSH 金鑰有密碼(passphrase),VS Code 的提取與同步功能在遠端執行時可能會當機。解決方法是使用沒有密碼的 SSH 金鑰、透過 HTTPS 複製,或從命令列執行 git push
  • 本機 Proxy 設定不會在容器內重複使用,這可能會導致擴充功能無法運作,除非設定了適當的 Proxy 資訊(例如具有適當 Proxy 資訊的全局 HTTP_PROXYHTTPS_PROXY 環境變數)。
  • 當 ssh-agent 執行版本 <= 8.8 且 SSH 用戶端(在任何平台上)執行版本 >= 8.9 時,Windows 上的 OpenSSH 版本之間存在不相容問題。解決方法是使用 winget 或從 Win32-OpenSSH/releases 下載安裝程式,將 Windows 上的 OpenSSH 升級到 8.9 或更高版本。(請注意,ssh-add -l 可以正確運作,但 ssh <ssh-server> 會失敗並顯示 <ssh-server>: Permission denied (publickey)。這也會影響使用 SSH 連接到儲存庫時的 Git。)

請參閱此處以獲取與容器相關的待處理問題清單

Docker 限制

請參閱 Docker 疑難排解指南以取得更多資訊:WindowsMac

Container Tools 擴充功能限制

如果您從 WSL、Remote - Tunnels 或 Remote - SSH 視窗使用 Container Tools 或 Kubernetes 擴充功能,在 Container Explorer 或 Kubernetes 檢視中使用 Attach Visual Studio Code 右鍵選單動作時,會要求您第二次從可用容器中進行選擇。

擴充功能限制

在此階段,大多數擴充功能無需修改即可在開發容器中運作。然而,在某些情況下,特定功能可能需要更改。如果您遇到擴充功能問題,請參閱此處的常見問題和解決方案摘要,您可以在報告問題時將其提及給擴充功能作者。

此外,雖然支援 Alpine,但某些安裝在容器中的擴充功能可能因為擴充功能內部的原生程式碼存在 glibc 相依性而無法運作。請參閱使用 Linux 進行遠端開發文章以獲取詳細資訊。

進階容器設定

請參閱進階容器設定文章,以取得關於下列主題的資訊

devcontainer.json 參考資料

這裡有完整的 devcontainer.json 參考資料,您可以在其中查看檔案結構,協助您自訂開發容器並控制附加到執行中容器的方式。

問題或意見回饋

疑難排解

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

當您在下列設定中執行開發容器時,可能會遇到此問題

請查看 issue #8278 以獲取潛在的解決方法。

後續步驟

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