容器工具提示和技巧
本文介紹了 Visual Studio Code 容器工具擴充套件的故障排除提示和技巧。有關設定和使用容器的詳細資訊,請參閱概述以及針對 Node.js、Python 或 ASP.NET 的快速入門文章。
以非 root 使用者身份執行
出於安全原因,我們建議在執行 容器:將 Docker 檔案新增到工作區... 命令時選擇預設埠,或者儘可能選擇一個大於 1023 的埠。這將允許 VS Code 使用非 root 訪問許可權來配置 Dockerfile,並防止惡意使用者在容器中提升許可權。在某些情況下,沒有埠選擇,因此容器工具擴充套件預設配置非 root 訪問。在所有情況下,您都必須確保應用程式修改或使用的每個資源(例如埠和檔案)都能被容器中的非 root 使用者訪問。
如果您在向工作區新增 Dockerfile 時選擇了小於 1024 的埠,容器工具擴充套件將無法建立一個以非 root 使用者身份執行容器的 Dockerfile。這是因為此範圍內的埠被稱為知名或系統埠,必須以 root 許可權執行才能將網路套接字繫結到 IP 地址。
如果您選擇一個非系統埠,容器:將 Docker 檔案新增到工作區... 命令會設定非 root 許可權。如果您當前的 Dockerfile 和 tasks.json
未設定為非 root 使用者使用,請嘗試執行容器:將 Docker 檔案新增到工作區... 命令,並選擇一個大於 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 Explorer
(非微軟編寫)的擴充套件衝突引起的。要解決此問題,請使用 vscode-docker issue #1609 中描述的解決方法。
擴充套件在遠端計算機上找不到 Docker
錯誤訊息:“連線失敗。Docker 是否已安裝並正在執行?”
- 請確保 Docker 引擎已在遠端計算機上安裝,並且 Docker CLI 可以正常工作(從終端執行
docker ps
並確保它不會返回任何錯誤)。 - 如果您正在使用遠端開發環境(透過 SSH 連線的遠端計算機、WSL 子系統、GitHub Codespace),請確保容器工具擴充套件在本地和遠端都已安裝。
無效的 URL 錯誤
如果您需要連線到遠端 Docker 守護程序,我們建議使用 Docker 上下文(contexts)而不是在設定中使用 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 環境變數。
問題和反饋
我們期待您的反饋!如果您有任何想法或建議,請報告問題。