Container Tools 提示與技巧
本文涵蓋 Visual Studio Code Container Tools 擴充功能的疑難排解提示與技巧。請參閱概觀以及 Node.js、Python 或 ASP.NET 的快速入門文章,以取得設定與使用容器的詳細資訊。
以非 root 使用者身分執行
基於安全考量,我們建議在執行 Containers: Add Docker Files to Workspace... 指令時選取預設連接埠,或者儘可能選擇大於 1023 的連接埠。這將允許 VS Code 設定 Dockerfile 以使用非 root 存取權限,並防止惡意使用者在容器中提升權限。在某些情況下,若無連接埠選項,Container Tools 擴充功能會預設設定為非 root 存取。無論在哪種情況下,您都必須確保應用程式修改或使用的每個資源(例如連接埠和檔案)皆可由您容器中的非 root 使用者存取。
如果您在將 Dockerfile 新增至工作區時選擇了小於 1024 的連接埠,Container Tools 擴充功能將無法建立以非 root 使用者身分執行容器的 Dockerfile。這是因為此範圍內的連接埠被稱為知名 (well-known) 或系統連接埠,必須具備 root 權限才能將網路通訊端 (network socket) 繫結至 IP 位址。
如果您選擇了非系統連接埠,Containers: Add Docker Files to Workspace... 指令會設定非 root 權限。如果目前的 Dockerfile 和 tasks.json 未設定為非 root 使用,請嘗試執行 Containers: Add Docker Files to Workspace... 指令,並選擇大於 1023 的連接埠。此指令會覆寫您目前的 Dockerfile 和 tasks.json。對於某些專案類型(例如 Python: General),您可能仍需要自行修改 Dockerfile 和 tasks.json。在 Dockerfile 中,您必須公開一個非系統連接埠,為您的應用程式代碼建立工作目錄,然後新增一個具備該應用程式目錄存取權限的非 root 使用者。請確保您公開的連接埠在所有參考它的位置皆已更新。在下方的範例中,Gunicorn 連接埠必須更新以符合已公開的連接埠。
# 1024 or higher
EXPOSE 1024
# ... other directives such as installing requirements.txt file
# Creates /app in container if it does not already exist
# Ports code into /app
WORKDIR /app
ADD . /app
# Creates a non-root user and adds permission to access the /app folder
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
CMD ["gunicorn", "--bind", "0.0.0.0:1024", "pythonPath.to.wsgi"]
接下來,請確保 tasks.json 中的 docker run 工作也預期使用相同的連接埠。您通常可以在 tasks.json 中搜尋舊連接埠號碼的所有出現位置,並將其替換為新的連接埠號碼。以下範例顯示了 Python Django 應用程式所需進行的變更。
{
"type": "docker-run",
"label": "docker-run: debug",
"dependsOn": ["docker-build"],
"python": {
"args": [
"runserver",
"0.0.0.0:1024", //<- Change the number after the colon
"--nothreading",
"--noreload"
],
"file": "manage.py"
}
}
Linux 上出現錯誤 "connect EACCES /var/run/docker.sock"
由於 VS Code 是以非 root 使用者身分執行的,因此您需要遵循 Linux 安裝後步驟中的「以非 root 使用者身分管理 Docker」步驟,才能從擴充功能存取 Docker。
容器與映像檔從 Container Explorer 中消失
這很可能是由於與另一個名為 Docker Explorer 的擴充功能(非 Microsoft 開發)衝突所導致。若要解決此問題,請使用 vscode-docker issue #1609 中描述的暫時解決方法。
擴充功能在遠端機器上找不到 Docker
錯誤訊息 "Failed to connect. Is Docker installed and running?"
- 請確保 Docker 引擎已安裝在遠端機器上,且 Docker CLI 可以運作(從終端機執行
docker ps並確保它不會傳回任何錯誤)。 - 如果您使用的是遠端開發環境(透過 SSH 的遠端機器、WSL 子系統、GitHub Codespace),請確保 Container Tools 擴充功能已同時安裝在遠端與本機。
無效的 URL 錯誤
如果您需要連線到遠端的 Docker daemon,我們建議使用 Docker Contexts,而不是設定中的 containers.environment 屬性。請查看此指南以了解如何建立並使用 Context 來與遠端 Docker daemon 通訊。
如果您仍然需要覆寫目前使用的 Docker Context,請確保您的 DOCKER_HOST 環境變數或 containers.environment.DOCKER_HOST 屬性在 URL 中包含了協定(例如 ssh://myuser@mymachine 或 tcp://1.2.3.4)。
注意:請記住,您的
containers.environment.DOCKER_HOST屬性將會覆寫您的 Docker Context,而DOCKER_HOST環境變數將會同時覆寫containers.environment.DOCKER_HOST屬性與您的 Docker Context。
提示:在 Powershell 中,您可以使用
$ENV:DOCKER_HOST = 'ssh://username@1.2.3.4'來變更您的 Docker 環境變數。
問題與回饋
我們期待您的回饋!如果您有任何想法或建議,請回報問題。