Docker 工具提示和技巧

本文介绍 Visual Studio Code Docker扩展的故障排除提示和技巧。有关设置和使用 Docker 的详细信息,请参阅Node.jsPythonASP.NET的概述和快速入门文章。

以非 root 用户身份运行

出于安全原因,我们建议在执行“将 Dockerfiles 添加到工作空间”命令时选择默认端口,或者尽可能选择大于1023 的端口。这将允许 VS Code 以非 root 访问权限配置 Dockerfile,并防止恶意用户提升容器中的权限。在某些情况下,没有端口选择,因此 Docker 扩展默认配置非 root 访问。在所有情况下,您必须确保容器中的非 root 用户可以访问应用程序修改或使用的每个资源(例如端口和文件)。

如果在将 Dockerfile 添加到工作区时选择小于 1024 的端口,则 Docker 扩展无法创建以非 root 用户身份运行容器的 Dockerfile。这是因为此范围内的端口称为众所周知的端口或系统端口,并且必须以 root 权限执行才能将网络套接字绑定到 IP 地址。

如果您选择非系统端口,则“将 Dockerfiles 添加到工作区”命令会设置非 root 权限。如果您当前的 Dockerfiletasks.json未设置为非 root 使用,请尝试运行命令Add Dockerfiles to Workspace ,并选择大于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"]

接下来,确保docker run任务tasks.json也需要相同的端口。您通常可以搜索任何出现的旧端口号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 视图中消失

这很可能是由于与另一个名为(不是由 Microsoft 编写)的扩展发生冲突引起的Docker Explorer要解决此问题,请使用vscode-docker 问题 #1609中描述的解决方法。

该扩展在远程计算机上找不到 Docker

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

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

无效网址错误

如果您需要连接到远程 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 中,您可以使用以下命令更改 Docker 环境变量$ENV:DOCKER_HOST = 'ssh://username@1.2.3.4'

问题和反馈

我们喜欢您的反馈!如果您有任何想法或建议,请报告问题