本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

容器工具技巧和窍门

本文涵盖了Visual Studio Code 容器工具扩展的故障排除提示和技巧。请参阅 概述和快速入门文章,了解有关设置和使用容器的详细信息。

以非超级用户身份运行

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

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

容器:添加Docker文件到工作区... 命令集会在您选择非系统端口时设置非根权限。如果您的当前Dockerfile和任务.json 未设置非根用户使用,请尝试运行命令 容器:将Docker文件添加到工作区...,并选择一个 大于 1023的端口。此命令将覆盖您当前的Dockerfile和任务.json对于某些项目类型,例如 Python: 一般,您可能仍然需要修改您的Dockerfile和 任务.json在Dockerfile中,你必须暴露一个非系统端口,创建一个用于你的应用代码的工作目录,然后添加一个具有应用目录访问权限的非根用户。确保你的暴露端口在任何地方被引用时都已更新。在下面的示例中,Gunicorn端口必须更新以匹配暴露的端口:

# 1024 或更高
暴露 1024

# ... 其他指令,例如安装 requirements.txt 文件

# 如果容器中不存在 /app,则创建 /app
# 将代码导入 /app
工作目录 /app
添加 . /app

# 创建一个非根用户并添加访问 /app 文件夹的权限
运行 adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
用户 appuser

命令 ["gunicorn", "--bind", "0.0.0.0:1024", "pythonPath.to.wsgi"]

接下来,确保docker 运行任务在任务.json也期望相同的端口。你通常可以在 中搜索旧端口号的任何出现情况任务.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"
  }
}

错误 "connect EACCES /var/run/docker.sock" 在 Linux 上

由于 VS Code 以非 root 用户运行,您需要按照 Linux 安装后步骤 中的“以非 root 用户管理 Docker”步骤来访问扩展中的 Docker。

容器和镜像已从容器浏览器中消失

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

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

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

  1. 确保在远程机器上安装了Docker引擎,并测试Docker CLI是否正常工作(运行docker ps从终端执行并确保没有返回任何错误。
  2. 如果您正在使用远程开发环境(通过 SSH、WSL 子系统、GitHub Codespace 远程机器),请确保远程和本地都安装了 Container Tools 扩展。

无效的URL错误

如果您需要连接到远程Docker守护进程,我们建议使用Docker上下文,而不是一个容器.环境 在设置中的属性。查看此指南以了解如何 创建和使用上下文 与远程Docker守护进程通信。

如果你仍然需要覆盖你当前使用的Docker上下文,请确保你的DOCKER_HOST环境变量或容器.环境.DOCKER_HOST属性包括在URL中协议(例如,ssh://我的用户@我的机器tcp://1.2.3.4)。

注意: 请记住你的 容器.环境.DOCKER_HOST属性将覆盖你的Docker上下文和DOCKER_HOST环境变量将覆盖两者容器.环境.DOCKER_HOST属性和你的Docker上下文。

提示:在 PowerShell 中,你可以通过 更改你的 Docker 环境变量$ENV:DOCKER_HOST = 'ssh://用户名@1.2.3.4'

问题和反馈

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