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

Dev Containers 技巧與竅門

本文件包含一些關於在不同環境中設定和使用 Dev Containers 擴充套件的技巧。

安裝 Docker 的其他方法

您可以透過多種方式使用 Docker 和 Dev Containers 擴充套件,包括:

  • 本地安裝 Docker。
  • 在遠端環境中安裝的 Docker。
  • 其他相容 Docker 的 CLI,本地或遠端安裝。

您可以在 其他 Docker 選項文件中瞭解更多資訊。

自定義 AI 聊天響應

自定義指令使您能夠描述通用指南或規則,以獲得與您的特定編碼實踐和技術棧匹配的響應。

您可以將自定義指令與 dev containers 結合使用,為 Copilot 提供更多關於您連線到的 dev container 型別的資訊(例如安裝了哪些語言或工具鏈)。您可以透過以下幾種方式實現:

  • 直接在您的 devcontainer.json 中新增 "github.copilot.chat.codeGeneration.instructions"
    • 我們釋出 dev container 資源(例如 映象Features)以使建立和連線到 dev containers 的過程更加容易,並且我們現在在這些檔案中包含了自定義指令。
    • 此處是 Python Feature 中自定義指令的示例。
  • 使用 copilot-instructions.md 檔案,就像在本地使用一樣

Docker Desktop for Windows 技巧

Docker Desktop for Windows 在大多數設定中都能正常工作,但存在一些“陷阱”可能導致問題。以下是一些避免這些問題的技巧:

  1. 考慮使用 Windows 10 (2004+) 上的新 Docker WSL 2 後端。如果您使用 Docker Desktop 的 WSL 2 後端,您可以使用它來開啟 WSL 中的資料夾以及本地資料夾。容器也在 Windows 和 WSL 內部共享,這個新引擎對檔案共享問題的敏感度較低。有關詳細資訊,請參閱 快速入門

  2. 切換出“Linux Containers on Windows (LCOW)”模式。雖然預設停用,但較新版本的 Docker 支援 Linux Containers on Windows (LCOW),它允許您同時使用 Windows 和 Linux 容器。但是,這是一個新功能,您可能會遇到問題,而 Dev Containers 擴充套件目前僅支援 Linux 容器。您可以透過右鍵單擊 Docker 工作列圖示並從上下文選單中選擇切換到 Linux 容器...來隨時切換出 LCOW 模式。

  3. 確保您的防火牆允許 Docker 設定共享驅動器。 Docker 只需要連線兩個本地 IP 地址,但某些防火牆軟體仍可能阻止任何驅動器共享或所需的埠。

以下是一些適用於舊版本 Docker for Windows 的技巧,但現在應該已經解決。如果您遇到因潛在迴歸導致的奇怪行為,這些技巧在過去曾解決過問題。

  1. 共享驅動器時使用 AD 域賬戶或本地管理員賬戶。不要使用 AAD(基於電子郵件)賬戶。 AAD(基於電子郵件)賬戶存在眾所周知的問​​題,如 Docker issue #132issue #1352 中所述。如果您必須使用 AAD 賬戶,請在您的計算機上建立一個單獨的本地管理員賬戶,僅用於共享驅動器。請遵循 此部落格文章中的步驟來完成所有設定。

  2. 堅持使用字母數字密碼以避免驅動器共享問題。當被要求在 Windows 上共享驅動器時,系統會提示您輸入具有管理員許可權的賬戶的使用者名稱和密碼。如果您收到使用者名稱或密碼不正確的警告,這可能是由於密碼中的特殊字元。例如,![] 已知會引起問題。將密碼更改為字母數字字元即可解決。有關詳細資訊,請參閱此關於 Docker volume mounting problems 的問題。

  3. 使用您的 Docker ID 登入 Docker(而不是您的電子郵件)。 Docker CLI 僅支援使用您的 Docker ID,因此使用您的電子郵件可能會導致問題。有關詳細資訊,請參閱 Docker issue #935

如果您仍然遇到問題,請參閱 Docker Desktop for Windows 故障排除指南

在 Docker Desktop 中啟用檔案共享

VS Code 的 Dev Containers 擴充套件只能在您的程式碼位於與 Docker 共享的資料夾或驅動器中時,才能自動將您的原始碼掛載到容器中。如果您從非共享位置開啟 dev container,容器將成功啟動但工作區將為空。

請注意,對於 Docker Desktop 的 WSL 2 引擎,此步驟不是必需的

要更改 Docker 的驅動器和資料夾共享設定:

Windows

  1. 右鍵單擊 Docker 工作列圖示,然後選擇設定
  2. 轉到資源 > 檔案共享,並勾選原始碼所在驅動器。
  3. 如果您看到一條訊息,說明您的本地防火牆正在阻止共享操作,請參閱 此 Docker KB 文章瞭解後續步驟。

macOS

  1. 單擊 Docker 選單欄項,然後選擇偏好設定
  2. 轉到資源 > 檔案共享。確認包含原始碼的資料夾位於列出的共享資料夾之一之下。

解決容器中 Git 行尾符問題(導致大量檔案被修改)

由於 Windows 和 Linux 使用不同的預設行尾符,Git 可能會報告大量已修改的檔案,但這些檔案除了行尾符之外沒有其他差異。為防止這種情況發生,您可以透過 .gitattributes 檔案或在 Windows 端全域性停用行尾符轉換。

通常,在您的儲存庫中新增或修改 .gitattributes 檔案是解決此問題的最可靠方法。將此檔案提交到原始碼管理將有助於他人,並允許您根據需要更改每個儲存庫的行為。例如,在儲存庫的根目錄下向 .gitattributes 檔案新增以下內容將強制所有內容為 LF,但需要 CRLF 的 Windows 批處理檔案除外:

* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf

請注意,這在Git v2.10+中有效,因此如果您遇到問題,請確保您安裝了最新的 Git 客戶端。您可以將儲存庫中需要 CRLF 的其他檔案型別新增到同一檔案中。

如果您更願意始終上傳 Unix 風格的行尾符(LF),則可以使用 input 選項。

git config --global core.autocrlf input

如果您希望完全停用行尾符轉換,請改用以下命令:

git config --global core.autocrlf false

最後,您可能需要重新克隆儲存庫才能使這些設定生效。

使用 Docker Compose 時避免在容器中設定 Git

有關解決此問題的更多資訊,請參閱主容器文章中的 與容器共享 Git 憑據

解決從容器進行 Git push 或同步時發生的掛起問題

如果您使用 SSH 克隆 Git 儲存庫,並且您的 SSH 金鑰有密碼,則在遠端執行 VS Code 的拉取和同步功能時可能會掛起。

使用沒有密碼的 SSH 金鑰、使用 HTTPS 克隆,或從命令列執行 git push 來繞過此問題。

解決缺少 Linux 依賴項的錯誤

某些擴充套件依賴於某些 Docker 映象中找不到的庫。有關解決此問題的幾種選擇,請參閱 Containers 文章。

加速 Docker Desktop 中的容器

預設情況下,Docker Desktop 只分配容器少量機器容量。在大多數情況下,這足夠了,但如果您正在執行需要更多容量的操作,可以增加記憶體、CPU 或磁碟使用量。

首先,嘗試停止任何您不再使用的正在執行的容器

如果這不能解決您的問題,您可能想看看 CPU 使用率是否確實是問題所在,或者是否有其他問題。一種簡單的檢查方法是安裝 Resource Monitor 擴充套件。當它安裝在容器中時,它會在狀態列中提供關於容器容量的資訊。

Resource use Status bar

如果您希望此擴充套件始終安裝,請將其新增到您的 settings.json

"dev.containers.defaultExtensions": [
    "mutantdino.resourcemonitor"
]

如果您確定需要為容器分配更多機器容量,請按照以下步驟操作:

  1. 右鍵單擊 Docker 工作列圖示,然後選擇設定 / 偏好設定
  2. 轉到高階以增加 CPU、記憶體或交換空間。
  3. 在 macOS 上,轉到磁碟以增加 Docker 被允許在您的機器上使用的磁碟量。在 Windows 上,此設定位於高階設定下的其他設定中。

最後,如果您的容器正在執行磁碟密集型操作,或者您只是在尋找更快的響應時間,請參閱 提高容器磁碟效能 以獲取技巧。VS Code 的預設設定針對便利性和普遍支援進行了最佳化,但可以進行最佳化。

清理未使用的容器和映象

如果您看到 Docker 報告磁碟空間不足的錯誤,通常可以透過清理未使用的容器和映象來解決。有幾種方法可以做到這一點:

選項 1:使用遠端資源管理器

您可以透過選擇遠端資源管理器,右鍵單擊要刪除的容器,然後選擇刪除容器來刪除容器。

Remote Explorer screenshot

但是,這不會清理您可能下載的任何映象,這些映象可能會佔用系統空間。

選項 2:使用 Container Tools 擴充套件

  1. 在 VS Code 中開啟一個本地視窗(檔案 > 新建視窗)。

  2. 如果尚未安裝,請從“擴充套件”檢視安裝 Container Tools 擴充套件

  3. 然後,您可以轉到“容器資源管理器”,展開容器映象節點,右鍵單擊,然後選擇刪除容器/映象

    Container Explorer screenshot

選項 3:使用 Docker CLI 選擇要刪除的容器

  1. 開啟一個本地終端/命令提示符(或在 VS Code 中使用本地視窗)。
  2. 鍵入 docker ps -a 以檢視所有容器的列表。
  3. 從列表中鍵入 docker rm <Container ID> 以刪除容器。
  4. 鍵入 docker image prune 以刪除所有未使用的映象。

如果 docker ps 命令未提供足夠的資訊來識別您要刪除的容器,以下命令將列出 VS Code 管理的所有開發容器以及用於生成它們的資料夾。

docker ps -a --filter="label=vsch.quality" --format "table {{.ID}}\t{{.Status}}\t{{.Image}}\tvscode-{{.Label \"vsch.quality\"}}\t{{.Label \"vsch.local.folder\"}}"

選項 4:使用 Docker Compose

  1. 開啟一個本地終端/命令提示符(或在 VS Code 中使用本地視窗)。
  2. 轉到帶有 docker-compose.yml 檔案的目錄。
  3. 鍵入 docker-compose down 以停止並刪除容器。如果您有多個 Docker Compose 檔案,可以使用 -f 引數指定其他 Docker Compose 檔案。

選項 4:刪除所有未執行的容器和映象

  1. 開啟一個本地終端/命令提示符(或在 VS Code 中使用本地視窗)。
  2. 鍵入 docker system prune --all

解決使用 Debian 8 的映象時 Dockerfile 構建失敗的問題

構建使用基於 Debian 8/Jessie 的映象(例如較舊版本的 node:8 映象)的容器時,可能會遇到以下錯誤:

...
W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/InRelease  Unable to find expected entry 'main/binary-amd64/Packages' in Release file (Wrong sources.list entry or malformed file)
E: Some index files failed to download. They have been ignored, or old ones used instead.
...

這是由 Debian 8 被“存檔”引起的眾所周知的問題。較新版本的映象通常會解決此問題,通常是透過升級到 Debian 9/Stretch。

有兩種方法可以解決此錯誤:

  • 選項 1:刪除依賴於該映象的任何容器,刪除該映象,然後重試構建。這應該會下載一個未受問題影響的更新映象。有關詳細資訊,請參閱清理未使用的容器和映象

  • 選項 2:如果您不想刪除容器或映象,請在 Dockerfile 中的任何 aptapt-get 命令之前新增此行。它會新增 Jessie 所需的源列表:

    # Add archived sources to source list if base image uses Debian 8 / Jessie
    RUN cat /etc/*-release | grep -q jessie && printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list
    

解決使用電子郵件登入 Docker Hub 時出錯的問題

Docker CLI 僅支援使用您的 Docker ID,因此使用您的電子郵件登入可能會導致問題。有關詳細資訊,請參閱 Docker issue #935

作為一種解決方法,請使用您的 Docker ID 登入 Docker,而不是您的電子郵件。

macOS 上 Hyperkit 的高 CPU 使用率

有一個Docker for Mac 的已知問題可能導致高 CPU 峰值。特別是,在監視檔案和構建時會發生高 CPU 使用率。如果您在 Activity Monitor 中看到 com.docker.hyperkit 的高 CPU 使用率,而您的 dev container 中幾乎沒有活動,您很可能遇到了此問題。請關注Docker issue以獲取更新和修復。

使用 SSH 隧道連線到遠端 Docker 主機

關於在遠端 Docker Machine 或 SSH 主機上開發的文章介紹了在處理遠端 Docker 主機時如何設定 VS Code。這通常只需將 Container Tools 擴充套件containers.environment 屬性在 settings.json 中設定,或將 DOCKER_HOST 環境變數設定為 ssh://tcp:// URI。

但是,在某些情況下,由於 SSH 配置複雜性或其他限制,這在您的環境中可能無效。在這種情況下,可以使用 SSH 隧道作為回退方案。

使用 SSH 隧道作為回退選項

您可以設定 SSH 隧道並將 Docker 套接字從遠端主機轉發到本地機器。

請按照以下步驟操作:

  1. 安裝一個與 OpenSSH 相容的 SSH 客戶端

  2. 更新您的使用者或工作區 settings.json 中的 Container Tools 擴充套件 containers.environment 屬性,如下所示:

    "containers.environment": {
        "DOCKER_HOST": "tcp://:23750"
    }
    
  3. 從本地終端 / PowerShell 執行以下命令(將 user@hostname 替換為您的伺服器的遠端使用者和主機名/IP):

    ssh -NL localhost:23750:/var/run/docker.sock user@hostname
    

VS Code 現在將能夠附加到遠端主機上的任何正在執行的容器。您也可以使用專門的本地 devcontainer.json 檔案建立/連線到遠端 dev container

完成後,按終端/PowerShell 中的 Ctrl+C 來關閉隧道。

注意: 如果 ssh 命令失敗,您可能需要在 SSH 主機上設定 AllowStreamLocalForwarding

  1. SSH 主機(不是本地)上,使用編輯器(如 Vim、nano 或 Pico)開啟 /etc/ssh/sshd_config
  2. 新增設定 AllowStreamLocalForwarding yes
  3. 重新啟動 SSH 伺服器(在 Ubuntu 上,執行 sudo systemctl restart sshd)。
  4. 重試。

持久化使用者配置檔案

您可以使用 mounts 屬性在 dev container 中持久化使用者配置檔案(例如,保留 shell 歷史記錄),使其在重建後仍然存在。

    "mounts": [
        "source=profile,target=/root,type=volume",
        "target=/root/.vscode-server,type=volume"
    ],

上面的程式碼首先建立一個名為 profile 的命名卷,並將其掛載到 /root,該卷將在重建後保留。然後,它建立一個匿名卷掛載到 /root/.vscode-server,該卷將在重建時被銷燬,這允許 VS Code 重新安裝擴充套件和點檔案。

高階容器配置技巧

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

擴充套件技巧

雖然許多擴充套件無需修改即可工作,但有一些問題可能導致某些功能無法按預期工作。在某些情況下,您可以使用其他命令來解決問題,而在其他情況下,可能需要修改擴充套件。 遠端擴充套件技巧部分提供了常見問題和解決技巧的快速參考。您也可以參考關於支援遠端開發的主要擴充套件文章,以獲得有關修改擴充套件以支援遠端擴充套件主機(extension host)的深入指南。

問題和反饋

報告問題

如果您在使用 Dev Containers 擴充套件時遇到問題,收集正確的日誌非常重要,這樣我們才能幫助診斷您的問題。您可以透過Dev Containers: Show Container Log來獲取 Dev Containers 擴充套件日誌。

如果您在使用其他擴充套件進行遠端操作時遇到問題(例如,其他擴充套件在遠端上下文中未正確載入或安裝),則從Remote Extension Host輸出頻道(Output: Focus on Output View)獲取日誌,並從下拉列表中選擇Log (Remote Extension Host)會很有幫助。

注意:如果您只看到Log (Extension Host),則表示這是本地擴充套件主機,遠端擴充套件主機未啟動。這是因為日誌通道僅在日誌檔案建立後才建立,所以如果遠端擴充套件主機未啟動,則不會建立遠端擴充套件主機日誌檔案,也不會在“輸出”檢視中顯示。在您的報告中包含這些資訊仍然很有幫助。

遠端問答和反饋資源

我們還有許多其他遠端資源。

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