Docker 工具秘訣與技巧
本文涵蓋 Visual Studio Code Docker 擴充功能的疑難排解秘訣與技巧。如需設定及使用 Docker 的詳細資訊,請參閱 概觀和 Node.js、Python 或 ASP.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 是否已安裝並執行?」
- 請確定遠端電腦上已安裝 Docker 引擎,且 Docker CLI 可運作 (從終端機執行
docker ps
並確保它未傳回任何錯誤)。 - 如果您使用的是遠端開發環境 (透過 SSH、WSL 子系統、GitHub Codespace 的遠端電腦),請確定 Docker 擴充功能已遠端以及本機安裝。
無效的 URL 錯誤
如果您需要連線到遠端 Docker daemon,我們建議使用 Docker 內容,而不是設定中的 docker.environment
屬性。查看本指南以了解如何建立及使用內容以與遠端 Docker daemon 通訊。
如果您仍然需要覆寫目前使用的 Docker 內容,請確定您的 DOCKER_HOST
環境變數或 docker.environment.DOCKER_HOST
屬性在 URL 中包含通訊協定 (例如,ssh://myuser@mymachine
或 tcp://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 環境變數
問題與意見反應
我們很樂意收到您的意見反應!如果您有任何想法或建議,請回報問題。