開發容器秘訣與訣竅
本文包含一些秘訣與訣竅,可協助您在不同環境中啟動並執行開發容器擴充功能。
安裝 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 以取得詳細資訊。
如果您仍然遇到問題,請參閱適用於 Windows 的 Docker Desktop 疑難排解指南。
在 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 推送或同步時的停止回應問題
如果您使用 SSH 複製 Git 存放庫,而您的 SSH 金鑰有密碼,當遠端執行時,VS Code 的提取和同步功能可能會停止回應。
使用沒有密碼的金鑰,使用 HTTPS 複製,或從命令列執行 git push
以解決此問題。
解決遺失 Linux 相依性的錯誤
某些擴充功能依賴於特定 Docker 映像中找不到的程式庫。如需解決此問題的幾個選項,請參閱容器文章。
加速 Docker Desktop 中的容器
預設情況下,Docker Desktop 僅為容器提供您電腦容量的一小部分。在大多數情況下,這已足夠,但如果您正在執行需要更多容量的工作,您可以增加記憶體、CPU 或磁碟使用量。
首先,嘗試停止任何您不再使用的執行中容器。
如果這無法解決您的問題,您可能需要查看 CPU 使用率是否真的是問題,或者是否還有其他問題發生。檢查此問題的簡單方法是安裝 資源監視器擴充功能。當安裝在容器中時,它會在狀態列中提供關於容器容量的資訊。
如果您希望永遠安裝此擴充功能,請將此項目新增至您的 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:如果您不想刪除容器或映像,請在任何
apt
或apt-get
命令之前,將此行新增至您的 Dockerfile。它會為 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 使用率。如果您在活動監視器中看到 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://localhost: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 上搜尋。
- 新增功能要求或回報問題。