容器工具提示和技巧
本文介紹了 Visual Studio Code 容器工具擴充套件程式的故障排除技巧。有關設定和使用容器的詳細資訊,請參閱 概述以及 Node.js、Python 或 ASP.NET 的快速入門文章。
以非 root 使用者身份執行
出於安全原因,我們建議在執行 Containers: Add Docker Files to Workspace... (容器:將 Docker 檔案新增到工作區...) 命令時選擇預設埠,或者儘可能選擇一個大於 1023 的埠。這樣,VS Code 就可以配置 Dockerfile 以實現非 root 訪問,並防止惡意使用者在容器中提升許可權。在某些情況下,沒有埠選擇,因此容器工具擴充套件程式會預設配置非 root 訪問。在所有情況下,您都必須確保應用程式修改或使用的每個資源(如埠和檔案)都可以被容器中的非 root 使用者訪問。
如果您在將 Docker 檔案新增到工作區時選擇小於 1024 的埠,容器工具擴充套件程式將 **無法** 建立以非 root 使用者身份執行容器的 Dockerfile。這是因為此範圍內的埠稱為 **知名** 或 **系統** 埠,必須使用 root 許可權來執行才能將網路套接字繫結到 IP 地址。
Containers: Add Docker Files to Workspace... (容器:將 Docker 檔案新增到工作區...) 命令會在您選擇非系統埠時設定非 root 許可權。如果當前的 Dockerfile 和 tasks.json 未設定為非 root 使用,請嘗試執行 Containers: Add Docker Files to Workspace... (容器:將 Docker 檔案新增到工作區...) 命令,並選擇一個大於 1023 的埠。此命令將覆蓋您當前的 Dockerfile 和 tasks.json。對於某些專案型別,例如 Python: General (Python:通用),您可能仍需要修改 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 安裝後步驟 中“將 Docker 作為非 root 使用者進行管理”的步驟來從擴充套件程式訪問 Docker。
容器和映象從容器資源管理器中消失
這很可能是由於與另一個名為 Docker Explorer (非 Microsoft 編寫) 的擴充套件程式發生衝突。要解決此問題,請使用 vscode-docker issue #1609 中描述的解決方法。
擴充套件程式在遠端計算機上找不到 Docker
錯誤訊息“連線失敗。Docker 是否已安裝並正在執行?”
- 請確保遠端計算機上**已安裝** Docker 引擎,並且 Docker CLI 可以正常工作(在終端中執行
docker ps並確保沒有返回任何錯誤)。 - 如果您正在使用遠端開發環境(透過 SSH 的遠端計算機、WSL 子系統、GitHub Codespace),請確保容器工具擴充套件程式在遠端和本地都已安裝。
無效的 URL 錯誤
如果您需要連線到遠端 Docker 守護程式,我們建議使用 Docker 上下文而不是在設定中使用 containers.environment 屬性。請參閱此指南,瞭解如何 建立和使用上下文 來與遠端 Docker 守護程式通訊。
如果您仍需要覆蓋當前使用的 Docker 上下文,請確保您的 DOCKER_HOST 環境變數或 containers.environment.DOCKER_HOST 屬性在 URL 中包含協議(例如,ssh://myuser@mymachine 或 tcp://1.2.3.4)。
注意:請記住,您的
containers.environment.DOCKER_HOST屬性將覆蓋您的 Docker 上下文,而DOCKER_HOST環境變數將覆蓋containers.environment.DOCKER_HOST屬性和您的 Docker 上下文。
提示:在 Powershell 中,您可以使用
$ENV:DOCKER_HOST = 'ssh://username@1.2.3.4'更改 Docker 環境變數
問題和反饋
我們非常重視您的反饋!如果您有任何想法或建議,請 報告一個 issue。