现已推出!阅读 10 月份的新功能和修复。

Docker 工具技巧和窍门

本文介绍了 Visual Studio Code Docker 扩展的疑难解答技巧和窍门。有关设置和使用 Docker 的详细信息,请参阅 概述Node.jsPythonASP.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 问题 #1609 中描述的解决方法。

扩展无法在远程机器上找到 Docker

错误消息“无法连接。Docker 是否已安装并正在运行?”

  1. 确保 Docker 引擎已在远程机器上 **安装**,并且 Docker CLI 可以正常工作(从终端运行 docker ps 并确保它不会返回任何错误)。
  2. 如果您使用的是远程开发环境(通过 SSH、WSL 子系统、GitHub Codespace 连接的远程机器),请确保 Docker 扩展已在远程和本地安装。

无效 URL 错误

如果您需要连接到远程 Docker 守护进程,建议使用 Docker 上下文,而不是设置中的 docker.environment 属性。请查看此指南,了解如何 创建和使用上下文 与远程 Docker 守护进程通信。

如果您仍然需要覆盖当前使用的 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://[email protected]' 更改 Docker 环境变量。

问题和反馈

我们非常重视您的反馈!如果您有任何想法或建议,请 报告问题