Dev Containers 提示和技巧

本文包含一些在不同环境中启动并运行 Dev Containers 扩展的提示和技巧。

安装 Docker 的其他方法

您可以通过多种方式将 Docker 与 Dev Containers 扩展结合使用,包括:

  • Docker 安装在本地。
  • Docker 安装在远程环境上。
  • 其他兼容 Docker 的 CLI,本地或远程安装。

您可以在替代 Docker 选项文档中了解更多信息。

适用于 Windows 的 Docker 桌面提示

适用于 Windows 的Docker Desktop在大多数设置中运行良好,但有一些“陷阱”可能会导致问题。以下是一些避免它们的提示:

  1. 考虑在 Windows 10 (2004+) 上使用新的 Docker WSL 2 后端。如果您使用Docker Desktop 的 WSL 2 后端,则可以使用它打开 WSL 内以及本地的文件夹。容器还在 Windows 之间和 WSL 内部共享,并且这个新引擎不易受到文件共享问题的影响。有关详细信息,请参阅快速入门

  2. 退出“Windows 上的 Linux 容器 (LCOW)”模式。虽然默认情况下处于禁用状态,但最新版本的 Docker 支持Windows 上的 Linux 容器 (LCOW),它允许您同时使用 Windows 和 Linux 容器。但是,这是一项新功能,因此您可能会遇到问题,并且 Dev Containers 扩展目前仅支持 Linux 容器。您可以随时退出 LCOW 模式,方法是右键单击 Docker 任务栏项目并从上下文菜单中选择切换到 Linux 容器...。

  3. 确保您的防火墙允许 Docker 设置共享驱动器。Docker 只需要在两台机器的本地 IP 之间进行连接,但某些防火墙软件可能仍会阻止任何驱动器共享或所需的端口。请参阅这篇 Docker 知识库文章,了解解决此问题的后续步骤。

以下是一些适用于旧版 Docker for Windows 的提示,但现在应该已得到解决。如果您由于可能的回归而遇到奇怪的行为,这些提示已经解决了过去的问题。

  1. 共享驱动器时使用AD域帐户或本地管理员帐户。请勿使用 AAD(基于电子邮件)帐户。AAD(基于电子邮件的)帐户存在众所周知的问题,如 Docker问题 #132问题 #1352中所述。如果必须使用 AAD 帐户,请在计算机上创建一个单独的本地管理员帐户,仅用于共享驱动器。按照这篇博文中的步骤完成所有设置。

  2. 坚持使用字母数字密码以避免驱动器共享问题。当要求在 Windows 上共享驱动器时,系统将提示您输入在计算机上具有管理员权限的帐户的用户名和密码。如果您收到有关用户名或密码不正确的警告,这可能是由于密码中存在特殊字符所致。例如,已知![]会导致问题。将密码更改为字母数字字符即可解决。有关详细信息,请参阅此有关Docker 卷安装问题的问题。

  3. 使用您的 Docker ID(而不是您的电子邮件)登录 Docker。Docker CLI 仅支持使用您的 Docker ID,因此使用您的电子邮件可能会导致问题。有关详细信息,请参阅 Docker问题 #935

如果仍然遇到问题,请参阅适用于 Windows 的 Docker Desktop 故障排除指南

在 Docker Desktop 中启用文件共享

仅当您的代码位于与 Docker 共享的文件夹或驱动器中时,VS Code Dev Containers扩展才能自动将源代码装载到容器中。如果从非共享位置打开 Dev Containers ,该容器将成功启动,但工作区将为空。

请注意, Docker Desktop 的 WSL 2 引擎不需要步骤。

要更改 Docker 的驱动器和文件夹共享设置:

视窗:

  1. 右键单击 Docker 任务栏项目并选择“设置”
  2. 转到资源 > 文件共享并检查源代码所在的驱动器。
  3. 如果您看到有关本地防火墙阻止共享操作的消息,请参阅此 Docker 知识库文章了解后续步骤。

苹果系统:

  1. 单击 Docker 菜单栏项并选择Preferences
  2. 转至资源 > 文件共享。确认包含源代码的文件夹位于列出的共享文件夹之一下。

解决容器中的 Git 行结束问题(导致许多文件被修改)

由于 Windows 和 Linux 使用不同的默认行结尾,Git 可能会报告大量已修改的文件,这些文件除了行结尾之外没有任何差异。为了防止这种情况发生,您可以使用.gitattributes文件或在 Windows 端全局禁用行结束转换。

通常,在存储库中添加或修改 .gitattributes文件是解决此问题的最可靠方法。将此文件提交到源代码管理将对其他人有所帮助,并允许您根据需要通过存储库改变行为。例如,将以下内容添加.gitattributes到存储库的根目录中将强制所有内容均为 LF,但需要 CRLF 的 Windows 批处理文件除外:

* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf

请注意,这适用于Git v2.10+,因此如果您遇到问题,请确保您安装了最新的 Git 客户端。您可以将需要 CRLF 的其他文件类型添加到同一文件中。

如果您仍希望始终上传 Unix 风格的行结尾 (LF),则可以使用该input选项。

git config --global core.autocrlf input

如果您希望完全禁用行结束转换,请运行以下命令:

git config --global core.autocrlf false

最后,您可能需要再次克隆存储库才能使这些设置生效。

使用 Docker Compose 时避免在容器中设置 Git

有关解决此问题的信息,请参阅主容器文章中的与容器共享 Git 凭据。

解决从容器执行 Git 推送或同步时的挂起问题

如果使用 SSH 克隆 Git 存储库并且 SSH 密钥有密码,则 VS Code 的拉取和同步功能可能会在远程运行时挂起。

使用不带密码的 SSH 密钥、使用 HTTPS 克隆或git push从命令行运行来解决该问题。

解决有关缺少 Linux 依赖项的错误

某些扩展依赖于某些 Docker 映像中未找到的库。请参阅容器文章,了解解决此问题的一些选项。

加速 Docker Desktop 中的容器

默认情况下,Docker Desktop 只为容器提供机器容量的一小部分。在大多数情况下,这已经足够了,但如果您正在执行需要更多容量的操作,则可以增加内存、CPU 或磁盘使用量。

首先,尝试停止任何不再使用的正在运行的容器。

如果这不能解决您的问题,您可能需要查看 CPU 使用率是否确实是问题所在,或者是否存在其他问题。检查这一点的一个简单方法是安装资源监视器扩展。当安装在容器中时,它会在状态栏中提供有关容器容量的信息。

资源使用状态栏

如果您希望始终安装此扩展,请将其添加到您的settings.json

"dev.containers.defaultExtensions": [
    "mutantdino.resourcemonitor"
]

如果您确定需要为容器提供更多机器容量,请按照以下步骤操作:

  1. 右键单击 Docker 任务栏项目并选择“设置/首选项”
  2. 转到“高级”以增加 CPU、内存或交换空间。
  3. 在 macOS 上,转到“磁盘”以增加允许 Docker 在计算机上使用的磁盘量。在 Windows 上,它位于“高级”下,并包含其他设置。

最后,如果您的容器正在执行磁盘密集型操作,或者您只是寻求更快的响应时间,请参阅提高容器磁盘性能以获取提示。VS Code 的默认设置是为了方便和通用支持而优化的,但可以优化。

清理未使用的容器和图像

如果您看到 Docker 报告磁盘空间不足的错误,通常可以通过清理未使用的容器和映像来解决此问题。有几种方法可以做到这一点:

选项 1:使用远程资源管理器

您可以通过选择“远程资源管理器”,右键单击要删除的容器,然后选择“删除容器”来删除容器

远程资源管理器屏幕截图

但是,这不会清除您可能已下载的任何图像,这可能会使您的系统变得混乱。

选项 2:使用 Docker 扩展

  1. 在 VS Code 中打开本地窗口(文件 > 新窗口)。

  2. 从“扩展”视图安装Docker 扩展(如果尚不存在)。

  3. 然后,您可以转到 Docker 视图并展开ContainersImages节点,右键单击并选择Remove Container / Image

    Docker 资源管理器截图

选项 3:使用 Docker CLI 选择要删除的容器

  1. 打开本地终端/命令提示符(或使用 VS Code 中的本地窗口)。
  2. 键入docker ps -a以查看所有容器的列表。
  3. 从此列表中键入docker rm <Container ID>内容以删除容器。
  4. 键入docker image prune以删除任何未使用的图像。

如果docker ps没有提供足够的信息来识别要删除的容器,以下命令将列出 VS Code 管理的所有 Dev Containers 以及用于生成它们的文件夹。

docker ps -a --filter="label=vsch.quality" --format "table {{.ID}}\t{{.Status}}\t{{.Image}}\tvscode-{{.Label \"vsch.quality\"}}\t{{.Label \"vsch.local.folder\"}}"

选项 4:使用 Docker Compose

  1. 打开本地终端/命令提示符(或使用 VS Code 中的本地窗口)。
  2. 转到包含您的docker-compose.yml文件的目录。
  3. 键入docker-compose down以停止并删除容器。如果您有多个 Docker Compose 文件,则可以使用参数指定其他 Docker Compose 文件-f

选项 4:删除所有未运行的容器和映像:

  1. 打开本地终端/命令提示符(或使用 VS Code 中的本地窗口)。
  2. 类型docker system prune --all.

使用 Debian 8 解决镜像的 Dockerfile 构建失败问题

当构建使用基于 Debian 8/Jessie 的镜像(例如旧版本的镜像node:8)的容器时,您可能会遇到以下错误:

...
W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/InRelease  Unable to find expected entry 'main/binary-amd64/Packages' in Release file (Wrong sources.list entry or malformed file)
E: Some index files failed to download. They have been ignored, or old ones used instead.
...

这是由 Debian 8 被“归档”引起的众所周知的问题。更新版本的映像通常可以通过升级到 Debian 9/Stretch 来解决此问题。

有两种方法可以解决此错误:

  • 选项 1:删除依赖于该映像的所有容器,删除该映像,然后再次尝试构建。这应该下载不受该问题影响的更新图像。有关详细信息,请参阅清理未使用的容器和图像

  • 选项 2:如果您不想删除容器或映像,请将此行添加到 Dockerfile 中的任何aptapt-get命令之前。它添加了 Jessie 所需的源列表:

    # Add archived sources to source list if base image uses Debian 8 / Jessie
    RUN cat /etc/*-release | grep -q jessie && printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list
    

解决使用电子邮件时出现的 Docker Hub 登录错误

Docker CLI 仅支持使用您的 Docker ID,因此使用您的电子邮件登录可能会导致问题。有关详细信息,请参阅 Docker问题 #935

作为解决方法,请使用您的 Docker ID 而不是电子邮件登录 Docker。

macOS 上 Hyperkit 的 CPU 利用率高

Mac 版 Docker存在一个已知问题,可能导致 CPU 峰值过高。特别是在查看文件和构建时会出现高 CPU 使用率。如果您在活动监视器中看到 CPU 使用率很高,com.docker.hyperkit而 Dev Containers 中几乎没有发生任何事情,那么您可能会遇到此问题。请关注Docker 问题以获取更新和修复。

使用 SSH 隧道连接到远程 Docker 主机

在远程 Docker 计算机或 SSH 主机上的容器内进行开发一文介绍了如何在使用远程 Docker 主机时设置 VS Code。这通常很简单,只需将Docker 扩展 docker.environment属性settings.jsonDOCKER_HOST环境变量设置为URIssh://即可tcp://

但是,由于 SSH 配置复杂性或其他限制,您可能会遇到这种情况在您的环境中不起作用的情况。在这种情况下,可以使用 SSH 隧道作为后备。

使用 SSH 隧道作为后备选项

您可以设置 SSH 隧道并将 Docker 套接字从远程主机转发到本地计算机。

按着这些次序:

  1. 安装OpenSSH 兼容的 SSH 客户端

  2. 更新用户或工作区中的Docker 扩展 属性,如下所示:docker.environmentsettings.json

    "docker.environment": {
        "DOCKER_HOST": "tcp://localhost:23750"
    }
    
  3. 从本地终端/PowerShell 运行以下命令(替换user@hostname为服务器的远程用户和主机名/IP):

    ssh -NL localhost:23750:/var/run/docker.sock user@hostname
    

VS Code 现在可以附加到远程主机上任何正在运行的容器。您还可以使用专门的本地devcontainer.json文件来创建/连接到远程 Dev Containers

完成后,在终端/PowerShell 中按Ctrl+C关闭隧道。

注意:如果该ssh命令失败,您可能需要AllowStreamLocalForwarding在 SSH 主机上执行此操作。

  1. 在SSH 主机/etc/ssh/sshd_config(非本地)上的编辑器(例如 Vim、nano 或 Pico)中打开。
  2. 添加设置 AllowStreamLocalForwarding yes
  3. 重新启动 SSH 服务器(在 Ubuntu 上,运行sudo systemctl restart sshd)。
  4. 重试。

保留用户配置文件

您可以使用该mounts属性在重建过程中将用户配置文件(以保留 shell 历史记录等内容)保留在 Dev Containers 中。

    "mounts": [
        "source=profile,target=/root,type=volume",
        "target=/root/.vscode-server,type=volume"
    ],

上面的代码首先创建一个名为profileMounted to的命名卷/root,该卷将在重建后继续存在。接下来,它会创建一个安装到的匿名卷,/root/.vscode-server该卷在重建时会被破坏,这允许 VS Code 重新安装扩展和点文件。

高级容器配置技巧

有关以下主题的信息,请参阅高级容器配置文章:

扩展提示

虽然许多扩展无需修改即可工作,但存在一些问题可能会阻止某些功能按预期工作。在某些情况下,您可以使用另一个命令来解决该问题,而在其他情况下,可能需要修改扩展。远程扩展提示部分提供了常见问题的快速参考以及解决这些问题的提示。您还可以参阅有关支持远程开发的主要扩展文章,以获取有关修改扩展以支持远程扩展主机的深入指南。

问题和反馈

报告问题

如果您遇到 Dev Containers 扩展问题,收集正确的日志非常重要,以便我们能够帮助诊断您的问题您可以使用Dev Containers: Show Container Log获取 Dev Containers 扩展日志。

如果您在远程使用其他扩展时遇到问题(例如,其他扩展未在远程上下文中正确加载或安装),从远程扩展主机输出通道获取日志会很有帮助(输出:关注输出视图) ,然后从下拉列表中选择日志(远程分机主机) 。

注意:如果您只看到日志(分机主机),则这是本地分机主机,远程分机主机未启动。这是因为日志通道仅在创建日志文件后创建,因此如果远程扩展主机未启动,则远程扩展主机日志文件不会创建,也不会显示在输出视图中。这仍然是包含在您的问题中的有用信息。

远程问题和反馈资源

我们还有各种其他远程资源: