Container Tools 提示與技巧

本文涵蓋 Visual Studio Code Container Tools 擴充功能的疑難排解提示與技巧。請參閱概觀以及 Node.jsPythonASP.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?"

  1. 請確保 Docker 引擎已安裝在遠端機器上,且 Docker CLI 可以運作(從終端機執行 docker ps 並確保它不會傳回任何錯誤)。
  2. 如果您使用的是遠端開發環境(透過 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@mymachinetcp://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 環境變數。

問題與回饋

我們期待您的回饋!如果您有任何想法或建議,請回報問題

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