开发容器技巧与窍门

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

安装 Docker 的替代方法

你可以用 Docker 搭配 Dev Containers 扩展,有几种方式,包括:

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

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

定制AI聊天回复

自定义说明可以帮助你描述常见的指南或规则,以获得符合你具体编码实践和技术栈的回答。

你可以用自定义的开发容器指令,向Copilot提供更多关于你连接的开发容器类型的信息(比如安装了哪些语言或工具链)。你可以通过几种方式实现:

  • 添加“github.copilot.chat.codeGeneration.instructions”直接在你的devcontainer.json
    • 我们发布开发容器资源(如图片功能),使创建和连接开发容器的过程更加简单,现在我们在这些文件中包含了自定义指令。
    • 这里有一个 Python 功能中自定义指令的示例。
  • 使用一个copilot-instructions.md就像本地文件一样

Docker 桌面版 Windows 提示

Docker Desktop for Windows 在大多数设置中表现良好,但也有一些“陷阱”可能会引发问题。以下是一些避免这些问题的建议:

  1. 考虑在 Windows 10(2004+)上使用新的 Docker WSL 2 后端。如果你使用 Docker Desktop 的 WSL 2 后端,可以用它在 WSL 内部以及本地打开文件夹。容器也在 Windows 和 WSL 内部共享,这个新引擎更不易出现文件共享问题。详情请参见快速入门

  2. 退出“Windows 上的 Linux 容器(LCOW)”模式。虽然默认禁用,但 Docker 的最新版本支持Windows上的 Linux 容器(LCOW),允许你同时使用Windows和Linux容器。不过这是新功能,因此你可能会遇到问题,而开发容器扩展目前只支持 Linux 容器。你可以通过右键点击 Docker 任务栏项目,从右键菜单中选择切换到 Linux 容器......来切换 LCOW 模式。

  3. 确保你的防火墙允许Docker设置共享硬盘。Docker只需要连接两个机器的本地IP,但有些防火墙软件可能仍然会阻止任何硬盘共享或需要的端口。

以下是一些适用于旧版 Docker for Windows 的建议,但现在应该已经解决了。如果你遇到可能的回归导致的奇怪行为,这些建议过去已经解决过问题。

  1. 共享硬盘时请使用AD域账户或本地管理员账户。不要使用AAD(基于电子邮件)账户。AAD(基于电子邮件)账户存在众所周知的问题,详见Docker问题#132issue#1352。如果你必须使用AAD账户,请在你的电脑上创建一个专门用于共享驱动器的本地管理员账户。请按照这篇博客文章中的步骤完成所有设置。

  2. 请坚持使用字母数字密码以避免硬盘共享问题。当被要求在Windows上共享硬盘时,系统会提示您输入拥有管理员权限账户的用户名和密码。如果有人提醒您用户名或密码错误,可能是因为密码中的特殊字符。例如,!, 并且已知会引发问题。请将密码改为字母数字字符以解决。详情请参见关于 Docker 卷挂载问题的问题。[]

  3. 使用你的 Docker ID 登录 Docker(而不是邮箱)。Docker CLI 只支持使用 Docker ID,所以使用邮箱可能会带来问题。详情请参见 Docker issue #935

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

在 Docker Desktop 中启用文件共享

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

请注意,Docker Desktop的WSL 2引擎并非必须此步骤。

要更改 Docker 的硬盘和文件夹共享设置:

Windows:

  1. 右键点击Docker任务栏项,选择设置
  2. GO资源>文件共享,检查你源代码所在的驱动器。
  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),可以使用输入选项。

git config --global core.autocrlf input

如果你更愿意完全禁用行尾转换,可以运行以下程序:

git config --global core.autocrlf false

最后,你可能需要再次克隆仓库,这些设置才会生效。

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

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

在从 Container 进行 Git 推送或同步时,解析会卡顿

如果你用SSH克隆了一个Git仓库,且你的SSH密钥带有密码短语,VS Code的拉取和同步功能在远程运行时可能会卡住。

要么用无密码的SSH密钥,要么用HTTPS克隆,要么直接运行Git 推送从命令行开始绕过这个问题。

解决关于缺少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. 在VS Code中打开本地窗口(新窗口>文件)。

  2. 如果还没有扩展视图,请从“扩展”视图安装容器工具扩展

  3. 然后你可以进入容器浏览器,展开容器图片节点,右键点击,选择“移除容器/图片”。

    容器浏览器截图

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

  1. 打开本地终端/Commands提示符(或者在VS Code中使用本地窗口)。
  2. 类型Docker PS -a查看所有容器列表。
  3. 类型docker rm <Container ID>从这个列表中移除一个容器。
  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. 打开本地终端/Commands提示符(或者在VS Code中使用本地窗口)。
  2. 去目录里,带你的docker-compose.yml档案。
  3. 类型docker-compose down停止并删除容器。如果你有多个 Docker Compose 文件,你可以通过-f争论。

选项4:删除所有未运行的容器和图片:

  1. 打开本地终端/Commands提示符(或者在VS Code中使用本地窗口)。
  2. 类型Docker system prune --all.

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

在构建基于Debian 8/Jessie的图像容器时——例如较旧版本的节点: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 来实现。

解决此错误有两种方法:

  • 选项一:移除所有依赖该镜像的容器,移除镜像,然后再尝试构建。这样可以下载一个不受问题影响的更新镜像。详情请参见清理未使用容器和图片

  • 选项二:如果你不想删除容器或镜像,可以在任何之前把这行添加到你的 Dockerfile 里公寓APT-GET指挥部。它添加了《杰西》所需的来源列表:

    # 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 使用率很高。如果你发现 CPU 使用率很高com.docker.hyperkit在活动监视器中,虽然你的开发容器里几乎没有什么作,但你很可能遇到了这个问题。关注 Docker 问题获取更新和修复。

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

在远程 Docker 机器或 SSH 主机上的容器内开发》文章介绍了如何在远程 Docker 主机上设置 VS Code。这通常只需设置容器工具扩展即可 containers.environment财产settings.json或者DOCKER_HOST环境变量ssh://tcp://URI。

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

使用 SSH 隧道作为备用选项

你可以搭建一个 SSH 隧道,把远程主机的 Docker 插槽转发到本地机器。

请按照以下步骤作:

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

  2. 更新容器工具扩展 containers.environment在你的用户或工作区中settings.json具体如下:

    "containers.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用于创建/连接远程开发容器的文件.

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

注:如果如果指令失败,你可能需要AllowStream本地转发在你的SSH主机上。

  1. 开门/等等/嘘/sshd_configSSH主机上的编辑器(如Vim、Nano或Pico)中(非本地)。
  2. 添加设置允许StreamLocalForwarding,是的.
  3. 重启SSH服务器(在Ubuntu上运行)sudo systemctl restart sshd).
  4. 重试。

持久化的用户配置文件

你可以使用坐骑属性用来在你的开发容器中持久化用户配置文件(比如保留shell历史记录),跨越重建过程。

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

上述代码首先创建一个名为简介安装于/根,该桥将经受重建。接着它创建一个匿名卷,挂载于/root/.vscode-server重建时会被销毁,这让VS Code可以重新安装扩展名和点文件。

高级容器配置技巧

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

延伸技巧

虽然许多扩展无需修改即可正常工作,但也有一些问题可能阻碍某些功能正常工作。在某些情况下,你可以用其他命令来绕过这个问题,而在另一些情况下,扩展可能需要修改。远程分机提示部分提供了常见问题的快速参考及解决建议。您也可以参考主扩展文章《支持远程开发》,其中包含关于如何修改扩展以支持远程扩展主机的深入指南。

问题与反馈

报告问题

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

如果你在远程使用其他扩展时遇到问题(例如,其他扩展在远程环境中加载或安装不正常),建议从远程扩展主机输出通道(输出:聚焦输出视图)获取日志,并从下拉菜单中选择日志(远程扩展主机)。

注意:如果你只看到日志(扩展主机),那就是本地扩展主机,远程扩展主机没有启动。这是因为日志通道是在日志文件创建后才创建的,如果远程扩展主机未启动,那么远程扩展主机的日志文件也未被创建,输出视图中也未显示。这些信息仍然很有帮助,值得你在问题中加入。

远程提问和反馈资源

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