现已发布!阅读关于 11 月新增功能和修复的内容。

Dev Containers 技巧与窍门

本文档包含一些关于在不同环境中设置和使用 Dev Containers 扩展的技巧。

安装 Docker 的其他方法

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

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

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

自定义 AI 聊天响应

自定义指令使您能够描述通用指南或规则,以获得与您的特定编码实践和技术栈匹配的响应。

您可以将自定义指令与 dev containers 结合使用,为 Copilot 提供更多关于您连接到的 dev container 类型的信息(例如安装了哪些语言或工具链)。您可以通过以下几种方式实现:

  • 直接在您的 devcontainer.json 中添加 "github.copilot.chat.codeGeneration.instructions"
    • 我们发布 dev container 资源(例如 镜像Features)以使创建和连接到 dev containers 的过程更加容易,并且我们现在在这些文件中包含了自定义指令。
    • 此处是 Python Feature 中自定义指令的示例。
  • 使用 copilot-instructions.md 文件,就像在本地使用一样

Docker Desktop for Windows 技巧

Docker Desktop for Windows 在大多数设置中都能正常工作,但存在一些“陷阱”可能导致问题。以下是一些避免这些问题的技巧:

  1. 考虑使用 Windows 10 (2004+) 上的新 Docker WSL 2 后端。如果您使用 Docker Desktop 的 WSL 2 后端,您可以使用它来打开 WSL 中的文件夹以及本地文件夹。容器也在 Windows 和 WSL 内部共享,这个新引擎对文件共享问题的敏感度较低。有关详细信息,请参阅 快速入门

  2. 切换出“Linux Containers on Windows (LCOW)”模式。虽然默认禁用,但较新版本的 Docker 支持 Linux Containers on Windows (LCOW),它允许您同时使用 Windows 和 Linux 容器。但是,这是一个新功能,您可能会遇到问题,而 Dev Containers 扩展目前仅支持 Linux 容器。您可以通过右键单击 Docker 任务栏图标并从上下文菜单中选择切换到 Linux 容器...来随时切换出 LCOW 模式。

  3. 确保您的防火墙允许 Docker 设置共享驱动器。 Docker 只需要连接两个本地 IP 地址,但某些防火墙软件仍可能阻止任何驱动器共享或所需的端口。

以下是一些适用于旧版本 Docker for Windows 的技巧,但现在应该已经解决。如果您遇到因潜在回归导致的奇怪行为,这些技巧在过去曾解决过问题。

  1. 共享驱动器时使用 AD 域账户或本地管理员账户。不要使用 AAD(基于电子邮件)账户。 AAD(基于电子邮件)账户存在众所周知的问​​题,如 Docker issue #132issue #1352 中所述。如果您必须使用 AAD 账户,请在您的计算机上创建一个单独的本地管理员账户,仅用于共享驱动器。请遵循 此博客文章中的步骤来完成所有设置。

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

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

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

在 Docker Desktop 中启用文件共享

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

请注意,对于 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 push 或同步时发生的挂起问题

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

使用没有密码的 SSH 密钥、使用 HTTPS 克隆,或从命令行运行 git push 来绕过此问题。

解决缺少 Linux 依赖项的错误

某些扩展依赖于某些 Docker 镜像中找不到的库。有关解决此问题的几种选择,请参阅 Containers 文章。

加速 Docker Desktop 中的容器

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

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

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

Resource use Status bar

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

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

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

  1. 右键单击 Docker 任务栏图标,然后选择设置 / 偏好设置
  2. 转到高级以增加 CPU、内存或交换空间。
  3. 在 macOS 上,转到磁盘以增加 Docker 被允许在您的机器上使用的磁盘量。在 Windows 上,此设置位于高级设置下的其他设置中。

最后,如果您的容器正在执行磁盘密集型操作,或者您只是在寻找更快的响应时间,请参阅 提高容器磁盘性能 以获取技巧。VS Code 的默认设置针对便利性和普遍支持进行了优化,但可以进行优化。

清理未使用的容器和镜像

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

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

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

Remote Explorer screenshot

但是,这不会清理您可能下载的任何镜像,这些镜像可能会占用系统空间。

选项 2:使用 Container Tools 扩展

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

  2. 如果尚未安装,请从“扩展”视图安装 Container Tools 扩展

  3. 然后,您可以转到“容器资源管理器”,展开容器镜像节点,右键单击,然后选择删除容器/镜像

    Container Explorer screenshot

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

  1. 打开一个本地终端/命令提示符(或在 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. 打开一个本地终端/命令提示符(或在 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 使用率。如果您在 Activity Monitor 中看到 com.docker.hyperkit 的高 CPU 使用率,而您的 dev container 中几乎没有活动,您很可能遇到了此问题。请关注Docker issue以获取更新和修复。

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

关于在远程 Docker Machine 或 SSH 主机上开发的文章介绍了在处理远程 Docker 主机时如何设置 VS Code。这通常只需将 Container Tools 扩展containers.environment 属性在 settings.json 中设置,或将 DOCKER_HOST 环境变量设置为 ssh://tcp:// URI。

但是,在某些情况下,由于 SSH 配置复杂性或其他限制,这在您的环境中可能无效。在这种情况下,可以使用 SSH 隧道作为回退方案。

使用 SSH 隧道作为回退选项

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

请按照以下步骤操作:

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

  2. 更新您的用户或工作区 settings.json 中的 Container Tools 扩展 containers.environment 属性,如下所示:

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

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

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

完成后,按终端/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 属性在 dev container 中持久化用户配置文件(例如,保留 shell 历史记录),使其在重建后仍然存在。

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

上面的代码首先创建一个名为 profile 的命名卷,并将其挂载到 /root,该卷将在重建后保留。然后,它创建一个匿名卷挂载到 /root/.vscode-server,该卷将在重建时被销毁,这允许 VS Code 重新安装扩展和点文件。

高级容器配置技巧

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

扩展技巧

虽然许多扩展无需修改即可工作,但有一些问题可能导致某些功能无法按预期工作。在某些情况下,您可以使用其他命令来解决问题,而在其他情况下,可能需要修改扩展。 远程扩展技巧部分提供了常见问题和解决技巧的快速参考。您也可以参考关于支持远程开发的主要扩展文章,以获得有关修改扩展以支持远程扩展主机(extension host)的深入指南。

问题和反馈

报告问题

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

如果您在使用其他扩展进行远程操作时遇到问题(例如,其他扩展在远程上下文中未正确加载或安装),则从Remote Extension Host输出频道(Output: Focus on Output View)获取日志,并从下拉列表中选择Log (Remote Extension Host)会很有帮助。

注意:如果您只看到Log (Extension Host),则表示这是本地扩展主机,远程扩展主机未启动。这是因为日志通道仅在日志文件创建后才创建,所以如果远程扩展主机未启动,则不会创建远程扩展主机日志文件,也不会在“输出”视图中显示。在您的报告中包含这些信息仍然很有帮助。

远程问答和反馈资源

我们还有许多其他远程资源。

© . This site is unofficial and not affiliated with Microsoft.