開發容器提示與技巧
本文包含一些提示與技巧,可協助您在不同環境中啟動並執行開發容器擴充功能。
安裝 Docker 的其他方式
您可以使用 Docker 與開發容器擴充功能,方法包括:
- 本機安裝的 Docker。
- 遠端環境中安裝的 Docker。
- 其他與 Docker 相容的 CLI,本機或遠端安裝。
- 雖然其他 CLI 可能可以使用,但它們並非官方支援。請注意,附加至 Kubernetes 叢集僅需要正確設定的 kubectl CLI。
您可以在替代 Docker 選項文件中了解更多資訊。
適用於 Windows 的 Docker Desktop 提示
適用於 Windows 的 Docker Desktop 在大多數設定中運作良好,但有一些「陷阱」可能會導致問題。以下是一些避免這些問題的提示:
-
考慮在 Windows 10 (2004+) 上使用新的 Docker WSL 2 後端。 如果您使用 Docker Desktop 的 WSL 2 後端,您可以使用它來開啟 WSL 內部以及本機的資料夾。容器也在 Windows 和 WSL 內部之間共用,而且這個新的引擎比較不容易受到檔案共用問題的影響。請參閱快速入門以取得詳細資訊。
-
切換出「Windows 上的 Linux 容器 (LCOW)」模式。 雖然預設為停用,但最新版本的 Docker 支援 Windows 上的 Linux 容器 (LCOW),讓您可以同時使用 Windows 和 Linux 容器。不過,這是一項新功能,因此您可能會遇到問題,而且開發容器擴充功能目前僅支援 Linux 容器。您可以隨時切換出 LCOW 模式,方法是按一下滑鼠右鍵 Docker 工作列項目,然後從內容功能表中選取切換至 Linux 容器...。
-
確定您的防火牆允許 Docker 設定共用磁碟機。 Docker 只需要在兩部機器本機 IP 之間連線,但某些防火牆軟體可能仍然會封鎖任何磁碟機共用或所需的連接埠。請參閱此 Docker 知識庫文章,以了解解決此問題的後續步驟。
以下是一些適用於舊版 Docker for Windows 的提示,但現在應該已解決。如果您因為可能的迴歸而遇到奇怪的行為,這些提示在過去已解決問題。
-
共用磁碟機時,請使用 AD 網域帳戶或本機管理員帳戶。請勿使用 AAD (以電子郵件為基礎) 帳戶。 AAD (以電子郵件為基礎) 帳戶有眾所皆知的問題,如 Docker 問題 #132 和 問題 #1352 中所述。如果您必須使用 AAD 帳戶,請在您的機器上建立一個個別的本機管理員帳戶,專門用於共用磁碟機。依照此部落格文章中的步驟來完成所有設定。
-
堅持使用英數字元密碼,以避免磁碟機共用問題。 當要求您在 Windows 上共用磁碟機時,系統會提示您輸入具有機器管理員權限的帳戶的使用者名稱和密碼。如果您收到關於使用者名稱或密碼不正確的警告,可能是因為密碼中有特殊字元。例如,已知
!
、[
和]
會造成問題。將您的密碼變更為英數字元以解決問題。請參閱關於 Docker 磁碟區掛接問題 的這個問題以取得詳細資訊。 -
使用您的 Docker ID 登入 Docker (而非您的電子郵件)。 Docker CLI 僅支援使用您的 Docker ID,因此使用您的電子郵件可能會造成問題。請參閱 Docker 問題 #935 以取得詳細資訊。
如果您仍然遇到問題,請參閱 Docker Desktop for Windows 疑難排解指南。
在 Docker Desktop 中啟用檔案共用
如果您的程式碼位於與 Docker 共用的資料夾或磁碟機中,VS Code 開發容器擴充功能才能自動將您的原始碼掛接到容器中。如果您從非共用位置開啟開發容器,容器將會成功啟動,但工作區將會是空的。
請注意,使用 Docker Desktop 的 WSL 2 引擎不需要此步驟。
若要變更 Docker 的磁碟機和資料夾共用設定:
Windows
- 按一下滑鼠右鍵 Docker 工作列項目,然後選取設定。
- 前往資源 > 檔案共用,然後勾選原始碼所在的磁碟機。
- 如果您看到關於本機防火牆封鎖共用動作的訊息,請參閱此 Docker 知識庫文章以了解後續步驟。
macOS
- 按一下 Docker 功能表列項目,然後選取偏好設定。
- 前往資源 > 檔案共用。確認包含您原始碼的資料夾是否在列出的共用資料夾之下。
解決容器中的 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 映像中找不到的程式庫。請參閱容器文章,以取得解決此問題的幾個選項。
加速 Docker Desktop 中的容器
根據預設,Docker Desktop 只會提供容器一部分的機器容量。在大多數情況下,這已足夠,但如果您正在執行需要更多容量的作業,您可以增加記憶體、CPU 或磁碟使用量。
首先,嘗試停止任何不再使用的執行中容器。
如果這無法解決您的問題,您可能想要查看 CPU 使用率是否真的是問題,或者是否有其他問題發生。檢查此問題的簡單方法是安裝 Resource Monitor 擴充功能。當安裝在容器中時,它會在狀態列中提供關於容器容量的資訊。
如果您希望永遠安裝此擴充功能,請將此項目新增至您的 settings.json
:
"dev.containers.defaultExtensions": [
"mutantdino.resourcemonitor"
]
如果您判斷您需要提供容器更多機器容量,請依照下列步驟執行:
- 按一下滑鼠右鍵 Docker 工作列項目,然後選取設定/偏好設定。
- 前往進階以增加 CPU、記憶體或交換空間。
- 在 macOS 上,前往磁碟以增加 Docker 允許在您的機器上使用的磁碟空間量。在 Windows 上,它與其他設定一起位於進階之下。
最後,如果您的容器正在執行磁碟密集型作業,或者您只是想要更快的回應時間,請參閱改善容器磁碟效能以取得提示。VS Code 的預設值針對便利性和通用支援進行最佳化,但可以進一步最佳化。
清除未使用的容器和映像
如果您看到 Docker 回報您磁碟空間不足的錯誤,通常可以透過清除未使用的容器和映像來解決此問題。有幾種方法可以執行此動作:
選項 1:使用遠端總管
您可以透過選取遠端總管來刪除容器,按一下滑鼠右鍵您要移除的容器,然後選取移除容器。
不過,這不會清除您可能已下載的任何映像,這些映像可能會使您的系統雜亂。
選項 2:使用 Docker 擴充功能
-
在 VS Code 中開啟本機視窗 (檔案 > 新視窗)。
-
從擴充功能檢視安裝 Docker 擴充功能 (如果尚未安裝)。
-
然後您可以前往 Docker 檢視,展開容器或映像節點,按一下滑鼠右鍵,然後選取移除容器/映像。
選項 3:使用 Docker CLI 選取要刪除的容器
- 開啟本機終端機/命令提示字元 (或在 VS Code 中使用本機視窗)。
- 輸入
docker ps -a
以查看所有容器的清單。 - 從此清單中輸入
docker rm <Container ID>
以移除容器。 - 輸入
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
- 開啟本機終端機/命令提示字元 (或在 VS Code 中使用本機視窗)。
- 前往具有
docker-compose.yml
檔案的目錄。 - 輸入
docker-compose down
以停止並刪除容器。如果您有多個 Docker Compose 檔案,您可以使用-f
引數指定其他 Docker Compose 檔案。
選項 4:刪除所有未執行的容器和映像
- 開啟本機終端機/命令提示字元 (或在 VS Code 中使用本機視窗)。
- 輸入
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 中,在任何
apt
或apt-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 問題 #935 以取得詳細資訊。
作為因應措施,請使用您的 Docker ID 登入 Docker,而不是您的電子郵件。
macOS 上 Hyperkit 的高 CPU 使用率
有一個 Docker for Mac 的已知問題,可能會導致 CPU 使用率飆高。特別是,在監看檔案和建置時發生高 CPU 使用率。如果您在 Activity Monitor 中看到 com.docker.hyperkit
的高 CPU 使用率,而您的開發容器中幾乎沒有任何活動,則您很可能遇到了這個問題。請追蹤 Docker 問題 以取得更新和修正。
使用 SSH 通道連線至遠端 Docker 主機
在遠端 Docker Machine 或 SSH 主機上的容器內開發文章涵蓋如何在處理遠端 Docker 主機時設定 VS Code。這通常就像在 settings.json
或 DOCKER_HOST
環境變數中,將 Docker 擴充功能 docker.environment
屬性設定為 ssh://
或 tcp://
URI 一樣簡單。
不過,在某些情況下,由於 SSH 設定複雜性或其他限制,您可能會遇到這種情況在您的環境中無法運作。在這種情況下,SSH 通道可以用作備用方案。
使用 SSH 通道作為備用選項
您可以設定 SSH 通道,並將 Docker Socket 從您的遠端主機轉送到您的本機機器。
請依照下列步驟執行:
-
如下所示,更新您的使用者或工作區
settings.json
中的 Docker 擴充功能docker.environment
屬性:"docker.environment": { "DOCKER_HOST": "tcp://127.0.0.1:23750" }
-
從本機終端機/PowerShell 執行下列命令 (將
user@hostname
取代為您伺服器的遠端使用者和主機名稱/IP):ssh -NL localhost:23750:/var/run/docker.sock user@hostname
VS Code 現在將能夠附加至遠端主機上的任何執行中容器。您也可以使用特定的本機 devcontainer.json
檔案來建立/連線至遠端開發容器。
完成後,在終端機/PowerShell 中按下 Ctrl+C 以關閉通道。
注意: 如果
ssh
命令失敗,您可能需要在您的 SSH 主機上AllowStreamLocalForwarding
。
- 在 SSH 主機上 (而非本機),在編輯器 (例如 Vim、nano 或 Pico) 中開啟
/etc/ssh/sshd_config
。- 新增設定
AllowStreamLocalForwarding yes
。- 重新啟動 SSH 伺服器 (在 Ubuntu 上,執行
sudo systemctl restart sshd
)。- 重試。
保存使用者設定檔
您可以使用 mounts
屬性來保存使用者設定檔 (以保留 Shell 歷程記錄等項目),使其跨重建在開發容器中持續存在。
"mounts": [
"source=profile,target=/root,type=volume",
"target=/root/.vscode-server,type=volume"
],
上述程式碼首先建立名為 profile
的具名磁碟區,掛接到 /root
,這將在重建後繼續存在。接著,它建立掛接到 /root/.vscode-server
的匿名磁碟區,該磁碟區會在重建時銷毀,這讓 VS Code 可以重新安裝擴充功能和點檔案。
進階容器設定提示
請參閱進階容器設定文章,以取得關於下列主題的資訊:
- 新增環境變數
- 新增另一個本機檔案掛接
- 變更或移除預設原始碼掛接
- 改善容器磁碟效能
- 將非根使用者新增至您的開發容器
- 設定 Docker Compose 的專案名稱
- 從容器內部使用 Docker 或 Kubernetes
- 一次連線至多個容器
- 在遠端 Docker Machine 或 SSH 主機上的容器內開發
- 減少 Dockerfile 建置警告
- 與您的容器共用 Git 認證
擴充功能提示
雖然許多擴充功能將在未修改的情況下運作,但有一些問題可能會阻止某些功能如預期般運作。在某些情況下,您可以使用另一個命令來解決此問題,而在其他情況下,可能需要修改擴充功能。遠端擴充功能提示章節提供常見問題和解決提示的快速參考。您也可以參閱關於 支援遠端開發 的主要擴充功能文章,以取得關於修改擴充功能以支援遠端擴充功能主機的深入指南。
問題與意見反應
回報問題
如果您遇到開發容器擴充功能的問題,請務必收集正確的記錄,以便我們能夠協助診斷您的問題。您可以使用開發容器:顯示容器記錄取得開發容器擴充功能記錄。
如果您在使用其他遠端擴充功能時遇到問題 (例如,其他擴充功能未在遠端內容中正確載入或安裝),請從遠端擴充功能主機輸出通道 (輸出:專注於輸出檢視) 抓取記錄會很有幫助,然後從下拉式清單中選取記錄 (遠端擴充功能主機)。
注意:如果您只看到記錄 (擴充功能主機),這是本機擴充功能主機,而遠端擴充功能主機未啟動。這是因為記錄通道僅在建立記錄檔後才會建立,因此如果遠端擴充功能主機未啟動,則不會建立遠端擴充功能主機記錄檔,並且不會顯示在輸出檢視中。這仍然是包含在您問題中的實用資訊。
遠端問題與意見反應資源
我們還有各種其他遠端資源:
- 在 Stack Overflow 上搜尋。
- 新增功能要求或回報問題。