开发容器技巧与窍门

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

安装Docker的其他方法

您可以通过几种方式使用带有Dev Containers扩展的Docker,包括:

  • 本地已安装Docker。
  • 在远程环境中安装的Docker。
  • 其他符合Docker标准的CLI,本地或远程安装。

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

Windows版Docker桌面提示

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容器。你可以随时通过右键单击Docker任务栏项并从上下文菜单中选择切换到Linux容器...来退出LCOW模式。

  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

如果您仍然遇到问题,请参阅Docker Desktop for Windows 故障排除指南

在Docker Desktop中启用文件共享

VS Code 的 Dev Containers 扩展只有在你的代码位于与 Docker 共享的文件夹或驱动器时,才能自动将你的源代码挂载到容器中。如果你从非共享位置打开开发容器,容器将成功启动,但工作区将是空的。

请注意,使用Docker Desktop的WSL 2引擎时,此步骤不是必需的

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

Windows:

  1. 右键点击Docker任务栏图标并选择设置
  2. 转到资源 > 文件共享并检查您的源代码所在的驱动器。
  3. 如果您看到有关本地防火墙阻止共享操作的消息,请参阅此Docker KB文章以获取后续步骤。

macOS:

  1. 点击Docker菜单栏项目并选择首选项
  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:使用远程资源管理器

您可以通过选择Remote Explorer,右键点击您想要删除的容器,然后选择Remove Container来删除容器。

远程资源管理器截图

然而,这并不会清理你可能已经下载的任何图片,这些图片可能会使你的系统变得杂乱。

选项2:使用Docker扩展

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

  2. 如果尚未安装,请从扩展视图中安装Docker扩展

  3. 然后,您可以转到Docker视图并展开容器镜像节点,右键单击,然后选择移除容器/镜像

    Docker Explorer 截图

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

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

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

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 文件,可以使用 -f 参数指定额外的 Docker Compose 文件。

选项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 issue #935

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

macOS上Hyperkit的高CPU利用率

有一个已知的Docker for Mac问题可能会导致CPU使用率飙升。特别是在监视文件和构建时,CPU使用率会很高。如果你在活动监视器中看到com.docker.hyperkit的CPU使用率很高,而你的开发容器中几乎没有进行任何操作,那么你可能遇到了这个问题。请关注Docker问题以获取更新和修复。

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

在远程 Docker 机器或 SSH 主机上的容器内开发文章介绍了如何在使用远程 Docker 主机时设置 VS Code。这通常就像在 settings.json 中设置 Docker 扩展docker.environment 属性或将 DOCKER_HOST 环境变量设置为 ssh://tcp:// URI 一样简单。

然而,您可能会遇到由于SSH配置复杂性或其他限制而在您的环境中无法正常工作的情况。在这种情况下,可以使用SSH隧道作为备用方案。

使用SSH隧道作为备用选项

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

按照以下步骤操作:

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

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

    "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文件来创建/连接到远程开发容器

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

注意: 如果 ssh 命令失败,您可能需要在 SSH 主机上启用 AllowStreamLocalForwarding

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

持久化用户配置文件

你可以使用mounts属性来在重建过程中持久化用户配置文件(以保留诸如shell历史记录等内容)在你的开发容器中。

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

上述代码首先创建了一个名为profile的命名卷,挂载到/root,该卷在重建后仍然存在。接下来,它创建了一个挂载到/root/.vscode-server的匿名卷,该卷在重建时会被销毁,这使得VS Code可以重新安装扩展和点文件。

高级容器配置技巧

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

扩展提示

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

问题和反馈

报告问题

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

如果您在使用其他扩展程序时遇到问题(例如,其他扩展程序在远程环境中无法正确加载或安装),从远程扩展主机输出通道(输出:聚焦输出视图)获取日志,并从下拉菜单中选择日志(远程扩展主机)会很有帮助。

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

远程问题和反馈资源

我们提供各种其他远程资源: