集装箱工具技巧与窍门

本文介绍了Visual Studio Code Container Tools扩展的故障排除技巧和窍门。有关如何设置和作容器的详细信息,请参见Node.jsPythonASP.NET 的概述和快速入门文章。

作为非root用户运行

出于安全考虑,我们建议在执行容器时选择默认端口:将 Docker 文件添加到工作区......命令,或者尽可能选择于 1023 的端口。这样 VS Code 就能将 Dockerfile 配置为非 root 权限,防止恶意用户提升容器权限。在某些情况下,没有端口选择,因此容器工具扩展默认配置非 root 访问。无论哪种情况,你都必须确保应用修改或使用的每个资源(如端口和文件)都能被容器中的非 root 用户访问。

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

容器:将 Docker 文件添加到工作区......如果你选择非系统端口,命令会设置非 root 权限。如果你现在用的是 Dockerfile 和tasks.json未设置为非root用途,尝试运行命令“容器:向工作区添加Docker 文件......”,并选择于1023的端口。这个命令会覆盖你当前的 Dockerfile 和tasks.json.对于某些项目类型,比如Python:通用,你可能仍然需要修改你的Docker文件和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 运行任务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用户身份运行,你需要按照安装后步骤中的“以非root用户管理Docker”作,才能通过扩展访问Docker。

容器和图片已从容器浏览器中消失

这很可能是由于与另一个名为Docker Explorer(非Microsoft作者)要解决这个问题,可以使用 vscode-docker 问题 #1609 描述的变通方法。

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

错误信息“连接失败。Docker 安装并运行了吗?”

  1. 确保远程机器上安装了 Docker 引擎,并且 Docker CLI 正常运行(运行)Docker PS从终端读取并确保不会返回任何错误)。
  2. 如果你使用远程开发环境(通过SSH、WSL子系统、GitHub Codespace远程机器),确保容器工具扩展既是本地又远程安装的。

无效URL错误

如果你需要连接远程的 Docker 守护进程,我们建议使用 Docker 上下文,而不是containers.environment属性。请查看这份指南,了解如何创建并使用上下文与远程 Docker 守护进程通信。

如果你仍然需要覆盖你当前使用的 Docker 上下文,请确保你的DOCKER_HOST环境变量或containers.environment.DOCKER_HOST属性中包含一个协议(例如,ssh://myuser@mymachinetcp://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'

问题与反馈

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