🚀 在 VS Code 中

Docker 工具秘訣與技巧

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

以非根使用者身分執行

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

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

如果您選擇非系統連接埠,將 Dockerfiles 新增至工作區命令會設定非根權限。如果目前的 Dockerfile 和 tasks.json 未設定為非根使用,請嘗試執行命令將 Dockerfiles 新增至工作區,然後選取大於 1023 的連接埠。此命令會覆寫您目前的 Dockerfile 和 tasks.json。對於某些專案類型 (例如 Python:一般),您可能仍然需要修改 Dockerfile 和 tasks.json。在 Dockerfile 中,您必須公開非系統連接埠、為您的應用程式程式碼建立工作目錄,然後新增具有應用程式目錄存取權的非根使用者。確保您的公開連接埠在任何參考它的地方都已更新。在以下範例中,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 以非根使用者身分執行,因此您需要依照「以非根使用者身分管理 Docker」中的步驟,從 Linux 的安裝後步驟存取擴充功能的 Docker。

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

這很可能是因為與另一個名為 Docker Explorer (非 Microsoft 撰寫) 的擴充功能衝突所造成。若要解決此問題,請使用 vscode-docker 問題 #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 環境變數

問題與意見反應

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