Docker 工具秘訣與技巧

本文涵蓋 Visual Studio Code Docker 擴充功能的疑難排解秘訣與技巧。如需設定和使用 Docker 的詳細資訊,請參閱 總覽和 Node.js、PythonASP.NET 的快速入門文章。

以非 root 使用者身分執行

基於安全性考量,我們建議在執行「將 Dockerfile 新增至工作區」命令時選取預設連接埠,或盡可能選擇大於 1023 的連接埠。這可讓 VS Code 使用非 root 存取權設定 Dockerfile,並防止惡意使用者提升容器中的權限。在某些情況下,沒有連接埠選取,因此 Docker 擴充功能預設會設定非 root 存取權。在所有情況下,您都必須確保您的應用程式修改或使用的每個資源 (例如連接埠和檔案) 都可以由容器中的非 root 使用者存取。

如果您在將 Dockerfile 新增至工作區時選取小於 1024 的連接埠,則 Docker 擴充功能無法建立以非 root 使用者身分執行容器的 Dockerfile。這是因為此範圍內的連接埠稱為「知名」或「系統」連接埠,而且必須以 root 權限執行,才能將網路通訊端繫結至 IP 位址。

如果您選擇非系統連接埠,「將 Dockerfile 新增至工作區」命令會設定非 root 權限。如果目前的 Dockerfile 和 tasks.json 未設定為非 root 使用,請嘗試執行「將 Dockerfile 新增至工作區」命令,並選取大於 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。

Docker 容器和映像已從 Docker 檢視中消失

這很可能是因為與另一個名為 Docker Explorer (非 Microsoft 撰寫) 的擴充功能衝突所造成。若要解決此問題,請使用 vscode-docker issue #1609 中描述的因應措施。

擴充功能在遠端電腦上找不到 Docker

錯誤訊息「連線失敗。Docker 是否已安裝並正在執行?」

  1. 請確定 Docker 引擎已安裝在遠端電腦上,且 Docker CLI 可運作 (從終端機執行 docker ps 並確保未傳回任何錯誤)。
  2. 如果您使用遠端開發環境 (透過 SSH 的遠端電腦、WSL 子系統、GitHub Codespace),請確定 Docker 擴充功能已遠端和本機安裝。

無效的 URL 錯誤

如果您需要連線到遠端 Docker daemon,我們建議使用 Docker 環境定義,而不是設定中的 docker.environment 屬性。請查看本指南以瞭解如何建立和使用環境定義與遠端 Docker daemon 通訊。

如果您仍然需要覆寫目前使用的 Docker 環境定義,請確定您的 DOCKER_HOST 環境變數或 docker.environment.DOCKER_HOST 屬性在 URL 中包含協定 (例如,ssh://myuser@mymachinetcp://1.2.3.4)。

注意:請記住,您的 docker.environment.DOCKER_HOST 屬性將覆寫您的 Docker 環境定義,而 DOCKER_HOST 環境變數將覆寫 docker.environment.DOCKER_HOST 屬性和您的 Docker 環境定義。

提示:在 Powershell 中,您可以使用 $ENV:DOCKER_HOST = 'ssh://username@1.2.3.4' 變更您的 Docker 環境變數

問題與意見反應

我們很樂意收到您的意見反應!如果您有任何想法或建議,請回報問題