在容器中開發
Visual Studio Code 開發容器擴充套件允許您將容器用作功能齊全的開發環境。它允許您在容器內部(或掛載到容器中)開啟任何資料夾,並利用 Visual Studio Code 的所有功能。專案中的 devcontainer.json 檔案會告訴 VS Code 如何使用定義完善的工具和執行時堆疊訪問(或建立)一個開發容器。此容器可用於執行應用程式或分離處理程式碼庫所需的工具、庫或執行時。
工作區檔案從本地檔案系統掛載,或複製或克隆到容器中。擴充套件在容器內部安裝和執行,它們可以完全訪問工具、平臺和檔案系統。這意味著您只需連線到不同的容器即可無縫切換整個開發環境。
這讓 VS Code 提供了本地質量的開發體驗,包括完整的 IntelliSense(補全)、程式碼導航和除錯,無論您的工具(或程式碼)位於何處。
開發容器擴充套件支援兩種主要操作模式:
- 您可以將容器用作全職開發環境。
- 您可以連線到正在執行的容器以檢查它。
注意:開發容器擴充套件支援開放的開發容器規範,它使任何工具中的任何人都可以配置一致的開發環境。您可以在我們的開發容器常見問題和規範網站 containers.dev 上了解更多資訊。
入門
注意:您可以在入門開發容器教程中瞭解如何快速開始使用開發容器。
系統要求
本地/遠端主機
您可以透過以下幾種方式將 Docker 與開發容器擴充套件一起使用:
- 本地安裝 Docker。
- 安裝在遠端環境上的 Docker。
- 其他符合 Docker 規範的 CLI,本地或遠端安裝。
- 雖然其他 CLI 可能有效,但它們不受官方支援。請注意,連線到 Kubernetes 叢集只需要一個配置正確的 kubectl CLI。
您可以在其他 Docker 選項文件中瞭解更多資訊。
以下是一些在本地或遠端主機上配置 Docker 的具體方法:
- Windows: Windows 10 專業版/企業版上的 Docker Desktop 2.0+。Windows 10 家庭版 (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 先決條件,它們可能也可以工作。
安裝
要開始,請按照以下步驟操作:
-
使用以下路徑之一或其他 Docker 選項(例如遠端主機上的 Docker 或符合 Docker 規範的 CLI)為您自己的作業系統安裝和配置 Docker。
Windows / macOS:
-
如果您在 Windows 上使用 WSL 2,為了確保 WSL 2 後端已啟用:右鍵單擊 Docker 工作列圖示並選擇設定。勾選使用基於 WSL 2 的引擎,並在資源 > WSL 整合下驗證您的分發已啟用。
-
當不使用 WSL 2 後端時,右鍵單擊 Docker 工作列圖示,選擇設定,並在資源 > 檔案共享中更新您原始碼所在的所有位置。有關故障排除,請參閱提示和技巧。
Linux:
-
按照針對您的分發官方 Docker CE/EE 安裝說明。如果您使用 Docker Compose,請同時按照Docker Compose 說明。
-
使用終端執行:
sudo usermod -aG docker $USER
將您的使用者新增到docker
組 -
登出並重新登入以使您的更改生效。
使用 Git?
這裡有兩條需要考慮的提示:
- 如果您在 Windows 本地和容器內使用相同的儲存庫,請務必設定一致的行尾。有關詳細資訊,請參閱提示和技巧。
- 如果您使用 Git 憑據管理器克隆,您的容器應該已經可以訪問您的憑據!如果您使用 SSH 金鑰,您還可以選擇共享它們。有關詳細資訊,請參閱與容器共享 Git 憑據。
選擇您的快速入門
本文件包含 3 個快速入門 - 我們建議從最適合您的工作流程和興趣的快速入門開始:
- 想在一個快速示例倉庫中嘗試開發容器嗎?請檢視快速入門 1:嘗試開發容器。
- 想將開發容器新增到您現有的本地克隆專案之一嗎?請檢視快速入門 2:在容器中開啟現有資料夾。
- 想使用倉庫的隔離副本,例如,審閱 PR 或調查分支而不影響您的本地工作?請檢視快速入門 3:在隔離容器卷中開啟 Git 倉庫或 PR。
快速入門:嘗試開發容器
最簡單的入門方法是嘗試一個示例開發容器。容器教程將引導您設定 Docker 和開發容器擴充套件,並讓您選擇一個示例:
注意:如果您已經安裝了 VS Code 和 Docker,那麼您可以使用在開發容器中開啟。您可以在建立開發容器指南中瞭解更多關於此內容以及如何將其新增到您的倉庫。
快速入門:在容器中開啟現有資料夾
本快速入門介紹如何為現有專案設定開發容器,以使用檔案系統上的現有原始碼作為您的全職開發環境。請按照以下步驟操作:
-
啟動 VS Code,從命令面板 (F1) 或快速操作狀態列項執行 開發容器:在容器中開啟資料夾... 命令,然後選擇您要為其設定容器的專案資料夾。
提示: 如果您想在開啟資料夾之前編輯容器的內容或設定,您可以改為執行 開發容器:新增開發容器配置檔案...。
-
現在為您的開發容器選擇一個起點。您可以從可篩選列表中選擇一個基礎開發容器模板,或者如果所選資料夾中存在現有 Dockerfile 或 Docker Compose 檔案,則可以使用它。
注意: 當使用 Alpine Linux 容器時,某些擴充套件可能無法工作,因為擴充套件內部的原生代碼存在
glibc
依賴項。列表將根據您開啟的資料夾內容自動排序。
您可以使用其他功能自定義您的開發容器,您可以在下面閱讀更多資訊。
顯示的開發容器模板來自我們的第一方和社群索引,它是開發容器規範的一部分。我們在devcontainers/templates 倉庫中託管了一組模板作為規範的一部分。您可以瀏覽該倉庫的
src
資料夾以檢視每個模板的內容。您還可以選擇使用 開發容器 CLI 釋出和分發您自己的開發容器模板。
-
為容器選擇起點後,VS Code 將向您的專案新增開發容器配置檔案 (
.devcontainer/devcontainer.json
)。 -
VS Code 視窗將重新載入並開始構建開發容器。進度通知提供狀態更新。您只需在第一次開啟開發容器時構建它;第一次成功構建後開啟資料夾將快得多。
-
構建完成後,VS Code 將自動連線到容器。
現在,您可以像在本地開啟專案一樣在 VS Code 中與您的專案進行互動。從現在開始,當您開啟專案資料夾時,VS Code 將自動拾取並重用您的開發容器配置。
提示: 想使用遠端 Docker 主機嗎?有關資訊,請參閱在容器中開啟遠端 SSH 主機上的資料夾一節。
雖然使用這種方法將本地檔案系統繫結掛載到容器中很方便,但它在 Windows 和 macOS 上確實存在一些效能開銷。您可以使用一些技術來提高磁碟效能,或者您可以改為使用隔離容器卷在容器中開啟倉庫。
在 Windows 上在容器中開啟 WSL 2 資料夾
如果您正在使用 適用於 Linux 的 Windows 子系統 v2 (WSL 2) 並啟用了 Docker Desktop 的 WSL 2 後端,您可以在 WSL 內部儲存的原始碼進行工作!
啟用 WSL 2 引擎後,您可以:
- 使用 WSL 擴充套件已開啟的資料夾中的 開發容器:在容器中重新開啟 命令。
- 從命令面板 (F1) 中選擇 開發容器:在容器中開啟資料夾...,然後使用本地
\\wsl$
共享(從 Windows 端)選擇一個 WSL 資料夾。
快速入門的其餘部分照舊適用!您可以在WSL 擴充套件文件中瞭解更多資訊。
在容器中開啟遠端 SSH 主機上的資料夾
如果您使用 Linux 或 macOS SSH 主機,您可以將 遠端 - SSH 和開發容器擴充套件一起使用。您甚至不需要在本地安裝 Docker 客戶端。
操作步驟如下:
- 按照遠端 - SSH 擴充套件的安裝和 SSH 主機設定步驟。
- 可選: 設定 SSH 基於金鑰的身份驗證到伺服器,這樣你就不需要多次輸入密碼。
- 在您的 SSH 主機上安裝 Docker。您無需在本地安裝 Docker。
- 按照遠端 - SSH 擴充套件的快速入門連線到主機並在那裡開啟資料夾。
- 從命令面板(F1,⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 開發容器:在容器中重新開啟 命令。
開發容器快速入門的其餘部分照舊適用。您可以在遠端 - SSH 擴充套件文件中瞭解更多資訊。如果此模型不符合您的需求,您還可以參閱在遠端 Docker 主機上開發文章以獲取其他選項。
在容器中開啟遠端隧道主機上的資料夾
您可以將 遠端 - 隧道 和開發容器擴充套件一起使用,以在容器內開啟遠端主機上的資料夾。您甚至不需要在本地安裝 Docker 客戶端。這類似於上面的 SSH 主機場景,但使用的是遠端 - 隧道。
操作步驟如下:
- 按照遠端 - 隧道擴充套件的入門說明。
- 在您的隧道主機上安裝 Docker。您無需在本地安裝 Docker。
- 按照遠端 - 隧道擴充套件的步驟連線到隧道主機並在那裡開啟資料夾。
- 從命令面板(F1,⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 開發容器:在容器中重新開啟 命令。
開發容器快速入門的其餘部分照舊適用。您可以在遠端 - 隧道擴充套件文件中瞭解更多資訊。如果此模型不符合您的需求,您還可以參閱在遠端 Docker 主機上開發文章以獲取其他選項。
在容器中開啟現有工作區
如果工作區僅引用了相對於 .code-workspace
檔案所在資料夾(或資料夾本身)的子資料夾的相對路徑,您還可以透過類似的過程在單個容器中開啟 VS Code 多根工作區。
您可以:
- 使用 開發容器:在容器中開啟工作區... 命令。
- 在容器中開啟包含
.code-workspace
檔案的資料夾後,使用 檔案 > 開啟工作區...。
連線後,您可能需要將 .devcontainer
資料夾新增到工作區,以便在它尚未可見的情況下輕鬆編輯其內容。
另請注意,雖然您不能在同一個 VS Code 視窗中為同一個工作區使用多個容器,但您可以從不同的視窗使用同時使用多個 Docker Compose 管理的容器。
快速入門:在隔離容器卷中開啟 Git 儲存庫或 GitHub PR
雖然您可以在容器中開啟本地克隆的儲存庫,但您可能希望使用儲存庫的隔離副本進行 PR 審查或調查其他分支,而不會影響您的工作。
儲存庫容器使用隔離的本地 Docker 卷,而不是繫結到本地檔案系統。除了不汙染您的檔案樹之外,本地卷還具有在 Windows 和 macOS 上提高效能的額外好處。(有關如何在其他場景中使用這些型別的卷的資訊,請參閱高階配置提高磁碟效能文章。)
例如,請按照以下步驟在儲存庫容器中開啟一個“試用”儲存庫:
-
啟動 VS Code 並從命令面板 (F1) 執行 開發容器:在容器卷中克隆儲存庫...。
-
在出現的輸入框中輸入
microsoft/vscode-remote-try-node
(或任何其他“試用”儲存庫)、Git URI、GitHub 分支 URL 或 GitHub PR URL,然後按 Enter。提示: 如果您選擇私人儲存庫,您可能需要設定憑據管理器或將您的 SSH 金鑰新增到您的 SSH 代理。請參閱與容器共享 Git 憑據。
-
如果您的倉庫中沒有
.devcontainer/devcontainer.json
檔案,系統將要求您從可篩選列表或現有 Dockerfile 或 Docker Compose 檔案(如果存在)中選擇一個起點。注意: 當使用 Alpine Linux 容器時,某些擴充套件可能無法工作,因為擴充套件內部的原生代碼存在
glibc
依賴項。列表將根據您開啟的資料夾內容自動排序。顯示的開發容器模板來自我們的第一方和社群索引,它是開發容器規範的一部分。我們在devcontainers/templates 倉庫中託管了一組模板作為規範的一部分。您可以瀏覽該倉庫的
src
資料夾以檢視每個模板的內容。 -
VS Code 視窗(例項)將重新載入,克隆原始碼,並開始構建開發容器。進度通知提供狀態更新。
如果您在步驟 2 中貼上了 GitHub 拉取請求 URL,PR 將自動簽出,並且 GitHub 拉取請求擴充套件將安裝在容器中。該擴充套件提供了額外的 PR 相關功能,例如 PR 瀏覽器、與 PR 評論內聯互動以及狀態列可見性。
-
構建完成後,VS Code 將自動連線到容器。現在,您可以像在本地克隆程式碼一樣,在這個獨立的開發環境中處理儲存庫原始碼。
請注意,如果容器因 Docker 構建錯誤等原因無法啟動,您可以在出現的對話方塊中選擇在恢復容器中重新開啟,進入一個“恢復容器”,允許您編輯 Dockerfile 或其他內容。這會在一個最小的容器中開啟帶有克隆儲存庫的 Docker 卷,並顯示建立日誌。修復完成後,使用在容器中重新開啟重試。
提示: 想使用遠端 Docker 主機嗎?有關資訊,請參閱在容器中開啟遠端 SSH 主機上的資料夾一節。
信任您的工作區
Visual Studio Code 非常重視安全性,並希望幫助您安全地瀏覽和編輯程式碼,無論來源或原始作者是誰。工作區信任功能可讓您決定專案資料夾是否應允許或限制自動程式碼執行。
開發容器擴充套件已採用工作區信任。根據您開啟和與原始碼互動的方式,系統會在不同時間提示您決定是否信任正在編輯或執行的程式碼。
在容器中重新開啟資料夾
為現有專案設定開發容器需要信任本地(或 WSL)資料夾。在視窗重新載入之前,系統會要求您信任本地(或 WSL)資料夾。
此流程有幾個例外:
- 單擊最近條目時。
- 如果尚未授予信任,使用在容器中開啟資料夾命令將在視窗重新載入後請求信任。
連線到現有容器
當連線到現有容器時,系統會要求您確認連線意味著您信任該容器。這隻確認一次。
在卷中克隆儲存庫
當在容器卷中克隆倉庫時,系統會要求您確認克隆倉庫意味著您信任該倉庫。這隻確認一次。
檢查卷
Docker 守護程序遠端執行
這意味著信任執行 Docker 守護程序的機器。沒有額外的提示需要確認(僅上面列出的本地/WSL 情況)。
建立 devcontainer.json 檔案
VS Code 的容器配置儲存在 devcontainer.json 檔案中。此檔案類似於用於除錯配置的 launch.json
檔案,但它用於啟動(或連線到)您的開發容器。您還可以指定容器執行後要安裝的任何擴充套件或用於準備環境的建立後命令。開發容器配置位於 .devcontainer/devcontainer.json
下,或儲存為專案根目錄中的 .devcontainer.json
檔案(注意點字首)。
從命令面板 (F1) 選擇 開發容器:新增開發容器配置檔案... 命令將所需檔案新增到您的專案作為起點,您可以根據需要進一步自定義。該命令允許您從基於資料夾內容的列表中選擇預定義的容器配置,重用現有的 Dockerfile,或重用現有的 Docker Compose 檔案。
您還可以手動建立 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
檔案的資訊,請參閱建立開發容器。
開發容器特性
開發容器“功能”是自包含的、可共享的安裝程式碼單元和開發容器配置。這個名稱來源於這樣的想法:引用其中一個功能可以讓您快速輕鬆地向您的開發容器新增更多工具、執行時或庫“功能”,供您或您的協作者使用。
當您使用 開發容器:新增開發容器配置檔案 時,您會看到一個指令碼列表,用於自定義現有的開發容器配置,例如安裝 Git 或 Azure CLI。
當您在容器中重新構建並重新開啟時,您選擇的功能將可在您的 devcontainer.json
中使用:
"features": {
"ghcr.io/devcontainers/features/github-cli:1": {
"version": "latest"
}
}
當您直接編輯 devcontainer.json
中的 "features"
屬性時,您會獲得 IntelliSense:
開發容器:配置容器功能 命令允許您更新現有配置。
VS Code UI 中源自的功能現在來自一箇中央索引,您也可以為其貢獻。請參閱開發容器規範網站以獲取當前列表,並瞭解如何釋出和分發功能。
“始終安裝”的功能
與您如何設定始終在開發容器中安裝擴充套件類似,您可以使用 dev.containers.defaultFeatures 使用者設定來設定您希望始終安裝的功能:
"dev.containers.defaultFeatures": {
"ghcr.io/devcontainers/features/github-cli:1": {}
},
建立您自己的功能
建立和釋出您自己的開發容器功能也很容易。已釋出的功能可以作為 OCI 工件儲存和共享,來自任何支援的公共或私有容器登錄檔。您可以在 containers.dev 上檢視當前已釋出功能的列表。
功能是包含 devcontainer-feature.json
和 install.sh
入口點指令碼的資料夾中的自包含實體。
+-- feature
| +-- devcontainer-feature.json
| +-- install.sh
| +-- (other files)
檢視 feature/starter 儲存庫,瞭解如何使用開發容器 CLI 釋出您自己的公共或私人功能。
功能規範和分發
功能是開源開發容器規範的關鍵部分。您可以查閱有關功能如何工作及其分發的更多資訊。
預構建開發容器映象
我們建議使用您需要的工具預構建映象,而不是每次在開發容器中開啟專案時都建立和構建容器映象。使用預構建映象將加快容器啟動速度,簡化配置,並允許您鎖定到特定版本的工具,以提高供應鏈安全性並避免潛在的故障。您可以透過使用 GitHub Actions 等 DevOps 或持續整合 (CI) 服務安排構建來自動化預構建映象。
更好的是——預構建的映象可以包含開發容器元資料,這樣當您引用一個映象時,設定將自動拉取過來。
我們建議使用 開發容器 CLI(或其他支援 規範 的實用程式,例如 GitHub Action)來預構建您的映象,因為它與開發容器擴充套件的最新功能(包括開發容器功能)保持同步。構建映象後,您可以將其推送到容器登錄檔(例如 Azure Container Registry、GitHub Container Registry 或 Docker Hub)並直接引用它。
您可以使用 devcontainers/ci 倉庫中的 GitHub Action 來幫助您在工作流中重用開發容器。
有關更多資訊,請參閱關於預構建映象的開發容器 CLI 文章。
繼承元資料
您可以透過映象標籤在預構建映象中包含開發容器配置和功能元資料。這使得映象自包含,因為當引用映象時(無論是在 Dockerfile 中直接、在 FROM
中引用,還是在 Docker Compose 檔案中),這些設定都會自動被拾取。這有助於防止您的開發容器配置和映象內容不同步,並允許您透過簡單的映象引用將相同的配置更新推送到多個儲存庫。
當您使用 開發容器 CLI(或其他支援 規範 的實用程式,例如 GitHub Action 或 Azure DevOps 任務)進行預構建時,此元資料標籤將自動新增,幷包含來自 devcontainer.json
和任何引用的開發容器功能的設定。
這允許您有一個單獨的更復雜的 devcontainer.json
,用於預構建映象,然後在一個或多個儲存庫中使用一個大大簡化的 devcontainer.json
。映象的內容將在建立容器時與此簡化的 devcontainer.json
內容合併(有關合並邏輯的資訊,請參閱規範)。但最簡單地說,您只需在 devcontainer.json
中直接引用映象即可使設定生效:
{
"image": "mcr.microsoft.com/devcontainers/go:1"
}
請注意,您也可以選擇手動將元資料新增到映象標籤中。即使您沒有使用開發容器 CLI 進行構建,這些屬性也會被拾取(即使您使用,CLI 也可以更新它們)。例如,考慮以下 Dockerfile 片段:
LABEL devcontainer.metadata='[{ \
"capAdd": [ "SYS_PTRACE" ], \
"remoteUser": "devcontainer", \
"postCreateCommand": "yarn install" \
}]'
檢查卷
有時您可能會遇到需要檢查或更改 Docker 命名卷的情況。您可以使用 VS Code 來處理這些內容,而無需建立或修改 devcontainer.json
檔案,只需從命令面板 (F1) 中選擇 開發容器:在開發容器中探索卷...。
您還可以在遠端資源管理器中檢查您的卷。確保在下拉列表中選擇了“容器”,然後您會注意到一個開發卷部分。您可以右鍵單擊卷以檢查其建立資訊,例如卷的建立時間、克隆到其中的儲存庫以及掛載點。您還可以在開發容器中探索它。
如果您安裝了 容器工具擴充套件,您可以右鍵單擊容器資源管理器的卷部分中的卷,然後選擇在開發容器中探索。
管理擴充套件
VS Code 在兩個地方執行擴充套件:本地 UI/客戶端側,或在容器中。雖然影響 VS Code UI 的擴充套件(如主題和程式碼片段)安裝在本地,但大多數擴充套件將駐留在特定容器中。這允許您在容器中僅安裝給定任務所需的擴充套件,並透過連線到新容器無縫切換整個工具鏈。
如果您從“擴充套件”檢視安裝擴充套件,它將自動安裝在正確的位置。您可以根據類別分組判斷擴充套件安裝在何處。將有一個本地 - 已安裝類別,還有一個用於您的容器的類別。
注意: 如果您是擴充套件作者,並且您的擴充套件無法正常工作或安裝在錯誤的位置,請參閱支援遠端開發以獲取詳細資訊。
實際需要在遠端執行的本地擴充套件將顯示在本地 - 已安裝類別中,並顯示為已停用。選擇安裝以在您的遠端主機上安裝擴充套件。
您還可以透過轉到“擴充套件”檢視並使用本地 - 已安裝標題欄右側的雲按鈕選擇在開發容器中安裝本地擴充套件:{名稱}來在開發容器中安裝所有本地安裝的擴充套件。這將顯示一個下拉選單,您可以在其中選擇要在容器中安裝的本地安裝擴充套件。
但是,某些擴充套件可能要求您在容器中安裝其他軟體。如果您遇到問題,請查閱擴充套件文件以獲取詳細資訊。
將擴充套件新增到 devcontainer.json
雖然您可以手動編輯 devcontainer.json 檔案以新增擴充套件 ID 列表,但您也可以在“擴充套件”檢視中右鍵單擊任何擴充套件並選擇新增到 devcontainer.json。
選擇退出擴充套件
如果基礎映象或功能配置了您不想在開發容器中安裝的擴充套件,您可以透過在副檔名稱前加一個減號來選擇退出。例如:
{
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm",
"customizations": {
"vscode": {
"extensions": ["-dbaeumer.vscode-eslint"]
}
}
}
“始終安裝”的擴充套件
如果您希望始終在任何容器中安裝某些擴充套件,您可以更新 dev.containers.defaultExtensions 使用者設定。例如,如果您想安裝 GitLens 和 資源監視器 擴充套件,您將按如下方式指定它們的擴充套件 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) 執行轉發埠命令來臨時轉發一個新埠,持續整個會話。
選擇埠後,通知將告訴您用於訪問容器中埠的 localhost 埠。例如,如果您轉發了一個監聽埠 3000 的 HTTP 伺服器,通知可能會告訴您它被對映到 localhost 上的埠 4123。然後您可以使用 https://:4123
連線到這個遠端 HTTP 伺服器。
如果您以後需要訪問此資訊,可以在遠端資源管理器的轉發埠部分找到。
如果您希望 VS Code 記住您已轉發的任何埠,請在“設定”編輯器中勾選遠端:恢復轉發埠(⌘, (Windows, Linux Ctrl+,))或在 settings.json
中設定 "remote.restoreForwardedPorts": true
。
釋出埠
Docker 有一個在建立容器時“釋出”埠的概念。釋出的埠行為與您提供給本地網路的埠非常相似。如果您的應用程式只接受來自 localhost
的呼叫,它將拒絕來自已釋出埠的連線,就像您的本地機器會拒絕網路呼叫一樣。另一方面,轉發的埠實際上看起來像應用程式的 localhost
。每種情況在不同情況下都可能有用。
要釋出埠,您可以:
-
使用 appPort 屬性: 如果您在
devcontainer.json
中引用映象或 Dockerfile,您可以使用appPort
屬性將埠釋出到主機。"appPort": [ 3000, "8921:5000" ]
-
使用 Docker Compose 埠對映: 埠對映可以輕鬆新增到您的
docker-compose.yml
檔案以釋出額外的埠。ports: - "3000" - "8921:5000"
在每種情況下,您都需要重建容器以使設定生效。當您連線到容器時,可以透過在命令面板 (F1) 中執行 開發容器:重建容器 命令來完成此操作。
開啟終端
從 VS Code 在容器中開啟終端很簡單。一旦您在容器中打開了一個資料夾,您在 VS Code 中開啟的任何終端視窗(終端 > 新建終端)都將自動在容器中執行,而不是在本地執行。
您還可以使用此終端視窗中的 code
命令列執行多項操作,例如在容器中開啟新檔案或資料夾。鍵入 code --help
以瞭解命令列中可用的選項。
在容器中除錯
在容器中開啟資料夾後,您可以使用 VS Code 的偵錯程式,就像在本地執行應用程式時一樣。例如,如果您在 launch.json
中選擇啟動配置並開始除錯 (F5),應用程式將在遠端主機上啟動並連線偵錯程式。
有關在 .vscode/launch.json
中配置 VS Code 除錯功能的詳細資訊,請參閱除錯文件。
容器特定設定
當您連線到開發容器時,VS Code 的本地使用者設定也會被重用。雖然這保持了您使用者體驗的一致性,但您可能希望在您的本地機器和每個容器之間更改其中一些設定。幸運的是,一旦您連線到容器,您還可以透過從命令面板 (F1) 執行 首選項:開啟遠端設定 命令或在設定編輯器中選擇遠端選項卡來設定容器特定設定。這些設定將在您連線到容器時覆蓋您已有的任何本地設定。
預設容器特定設定
您可以使用 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"
}
}
}
由於這只是建立預設值,因此在容器建立後您仍然可以根據需要更改設定。
管理容器
預設情況下,當您開啟資料夾時,開發容器擴充套件會自動啟動 devcontainer.json
中提到的容器。當您關閉 VS Code 時,該擴充套件會自動關閉您已連線的容器。您可以透過向 devcontainer.json
新增 "shutdownAction": "none"
來更改此行為。
雖然您可以使用命令列管理容器,但您也可以使用遠端資源管理器。要停止容器,請從下拉列表中選擇“容器”(如果存在),右鍵單擊正在執行的容器,然後選擇停止容器。您還可以啟動已退出的容器、移除容器和移除最近的資料夾。從“詳細資訊”檢視中,您可以轉發埠並在瀏覽器中開啟已轉發的埠。
如果您想清理映象或批次刪除容器,請參閱清理未使用的容器和映象以獲取不同選項。
使用點檔案倉庫進行個性化設定
點檔案是檔名以點(.
)開頭的檔案,通常包含各種應用程式的配置資訊。由於開發容器可以涵蓋廣泛的應用程式型別,因此將這些檔案儲存在某個地方會很有用,這樣您就可以在容器啟動並執行後輕鬆地將它們複製到容器中。
一種常見的方法是將這些點檔案儲存在 GitHub 儲存庫中,然後使用實用程式克隆並應用它們。開發容器擴充套件內建支援在您自己的容器中使用這些檔案。如果您對這個想法不熟悉,請檢視現有的不同點檔案引導儲存庫。
要使用它,請將您的 dotfiles GitHub 儲存庫新增到 VS Code 的使用者設定(⌘, (Windows, Linux Ctrl+,)),如下所示:
或者在 settings.json
中:
{
"dotfiles.repository": "your-github-id/your-dotfiles-repo",
"dotfiles.targetPath": "~/dotfiles",
"dotfiles.installCommand": "install.sh"
}
從此時起,每當建立容器時都會使用點檔案倉庫。
已知限制
開發容器限制
- 不支援 Windows 容器映象。
- 多根工作區中的所有根/資料夾都將在同一個容器中開啟,無論在較低級別是否存在配置檔案。
- 不支援非官方的 Ubuntu Docker snap Linux 包。請遵循適用於您發行版的官方 Docker 安裝說明。
- 不支援 Windows 上的 Docker Toolbox。
- 如果你使用 SSH 克隆 Git 倉庫,並且你的 SSH 金鑰有密碼短語,VS Code 的拉取和同步功能在遠端執行時可能會掛起。請使用不帶密碼短語的 SSH 金鑰,使用 HTTPS 克隆,或者從命令列執行
git push
來解決此問題。 - 本地代理設定不會在容器內部重用,這可能會阻止擴充套件工作,除非配置了適當的代理資訊(例如,具有適當代理資訊的全域性
HTTP_PROXY
或HTTPS_PROXY
環境變數)。 - 當 ssh-agent 執行版本 <= 8.8 且 SSH 客戶端(在任何平臺)執行版本 >= 8.9 時,Windows 上的 OpenSSH 版本之間存在不相容性。解決方法是將 Windows 上的 OpenSSH 升級到 8.9 或更高版本,可以使用 winget 或從 Win32-OpenSSH/releases 安裝程式。(請注意,
ssh-add -l
將正常工作,但ssh
將失敗並顯示
。這也會影響使用 SSH 連線到儲存庫的 Git。): Permission denied (publickey)
有關與容器相關的活動問題列表,請參閱此處。
Docker 限制
請參閱 Docker 故障排除指南,瞭解 Windows 或 Mac,並查閱 Docker 支援資源以獲取更多資訊。
容器工具擴充套件限制
如果您在 WSL、遠端 - 隧道或遠端 - SSH 視窗中使用容器工具或 Kubernetes 擴充套件,則在“容器資源管理器”或“Kubernetes”檢視中使用附加 Visual Studio Code 上下文選單操作將再次要求從可用容器中進行選擇。
擴充套件限制
目前,大多數擴充套件無需修改即可在開發容器內工作。但是,在某些情況下,某些功能可能需要更改。如果您遇到擴充套件問題,請參閱此處,瞭解常見問題和解決方案的摘要,您可以在報告問題時向擴充套件作者提及這些內容。
此外,雖然支援 Alpine,但容器中安裝的一些擴充套件可能由於擴充套件中的原生程式碼中存在 glibc
依賴項而無法工作。有關詳細資訊,請參閱使用 Linux 進行遠端開發文章。
高階容器配置
請參閱高階容器配置文章,瞭解以下主題:
- 新增環境變數
- 新增另一個本地檔案掛載
- 更改或移除預設原始碼掛載
- 提高容器磁碟效能
- 向您的開發容器新增非根使用者
- 設定 Docker Compose 的專案名稱
- 在容器內部使用 Docker 或 Kubernetes
- 同時連線到多個容器
- 在遠端 Docker Machine 或 SSH 主機上的容器中開發
- 減少 Dockerfile 構建警告
- 與容器共享 git 憑據
devcontainer.json 參考
有一個完整的 devcontainer.json 參考,您可以在其中檢視檔案模式,以幫助您自定義開發容器並控制如何連線到正在執行的容器。
問題或反饋
- 請參閱提示和技巧或常見問題。
- 在 Stack Overflow 上搜索。
- 新增功能請求或報告問題。
- 建立開發容器模板或特性供他人使用。
- 審查並提供關於開發容器規範的反饋。
- 為我們的文件或VS Code 本身做出貢獻。
- 請參閱我們的貢獻指南瞭解詳細資訊。
故障排除
無法寫入檔案 (NoPermissions (FileSystemError))
在以下配置中執行開發容器時,您可能會遇到此問題:
- Docker Desktop 使用適用於 Linux 的 Windows 子系統 (WSL) 後端執行
- 啟用增強容器隔離 (ECI)
請檢視問題 #8278 以獲取可能的解決方法。
後續步驟
- 連線到正在執行的容器 - 連線到已經執行的 Docker 容器。
- 建立開發容器 - 為您的工作環境建立自定義容器。
- 高階容器 - 查詢高階容器場景的解決方案。
- devcontainer.json 參考 - 檢視
devcontainer.json
模式。