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

开发容器提示和技巧

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

安装Docker的替代方法

您可以使用Docker与Dev Containers扩展,有几种方式,包括:

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

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

定制 AI 聊天回复

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

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

  • 添加"github.copilot.chat.codeGeneration.instructions"直接在你的devcontainer.json
    • 我们发布开发容器资源(如镜像功能),以使创建和连接开发容器的过程更加简单,并且我们现在在这些文件中包含自定义说明。
    • 这里是Python特性中自定义指令的一个例子。
  • 使用一个Copilot指令.md文件就像你在本地一样

Docker Windows 桌面版小贴士

Docker Desktop 在大多数 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之间进行连接,但某些防火墙软件可能会仍然阻止任何驱动器共享或所需的端口。

这里有一些适用于 Windows 版本的旧版Docker的提示,但这些问题现在应该已经解决。如果你遇到由于可能的回归而产生的奇怪行为,这些提示在过去已经解决了问题。

  1. 在共享驱动器时,请使用AD域账户或本地管理员账户。不要使用AAD(基于电子邮件的)账户。AAD(基于电子邮件的)账户有已知问题,如在Docker中记录的问题 #132问题 #1352。如果必须使用AAD账户,请在您的机器上创建一个单独的本地管理员账户,专门用于共享驱动器的目的。按照这篇文章中的步骤进行设置。

  2. 请使用字母数字密码,以避免驱动器共享问题。 在Windows系统中被要求共享驱动器时,系统会提示您输入具有机器管理员权限的账户名和密码。如果收到用户名或密码错误的警告,这可能是由于密码中包含特殊字符。例如,输入:[输入:] 已知会导致问题。将您的密码更改为字母数字字符以解决此问题。请参阅此关于 Docker 卷挂载问题 的详细信息。

  3. 使用你的Docker ID登录Docker(不是你的邮箱)。 Docker CLI仅支持使用你的Docker ID,因此使用你的邮箱可能会导致问题。请参阅Docker问题 #935了解详情。

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

在Docker Desktop中启用文件共享

VS CodeDev 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 批处理文件:

* 文本=自动 eol=换行
*.{命令,[cC][mM][dD]} 文本 eol=回车换行
*.{批处理,[bB][aA][tT]} 文本 eol=回车换行

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

如果您仍然希望始终上传 Unix 样式的行尾 (LF),您可以使用输入选项。

git 配置 --全局 core.autocrlf 输入

如果你希望完全禁用行尾转换,请运行以下命令:

git 配置 --全局 core.autocrlf

最后,您可能需要再次克隆该仓库以使这些设置生效。

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

参见在主容器文章中了解如何与容器共享Git凭证以解决此问题。

解决从容器进行Git推送或同步时卡顿的问题

如果你通过 SSH 克隆一个 Git 仓库,并且你的 SSH 密钥有密码,VS Code 的 pull 和 sync 功能在远程运行时可能会卡住。

使用没有密码的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:使用远程浏览器

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

远程浏览器截图

然而,这并不能清理你可能下载的任何图像,这可能会使你的系统变得混乱。

选项2:使用Container Tools扩展

  1. 打开一个本地Windows在VS Code中 (文件 > 新Windows).

  2. 安装容器工具扩展,如果尚未安装。

  3. 然后你可以进入容器浏览器,展开容器镜像节点,右键单击并选择移除容器/镜像

    容器探索者截图

选项3:使用Docker CLI选择容器进行删除

  1. 打开一个本地终端/Commands提示符(或在 VS Code 中使用本地Windows)。
  2. 类型docker ps -a查看所有容器的列表。
  3. 类型docker rm <容器 ID>从这个列表中删除一个容器。
  4. 类型docker 镜像清理删除任何未使用的图像。

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

docker ps -a --filter="label=vsch质量" --format "table {{.ID}}\t{{.Status}}\t{{.Image}}\tvscode-{{.Label \"vsch质量\"}}\t{{.Label \"vsch本地文件夹\"}}"

选项 4: 使用 Docker Compose

  1. 打开一个本地终端/Commands提示符(或在 VS Code 中使用本地Windows)。
  2. 请将以下文本翻译成中文: Go to the directory with yourdocker-compose.yml文件。
  3. 类型docker-compose 停止停止并删除容器。如果你有多个Docker Compose文件,你可以通过指定额外的Docker Compose文件来实现。-输入:f争论。

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

  1. 打开一个本地终端/Commands提示符(或在 VS Code 中使用本地Windows)。
  2. 类型docker系统清理 --全部输入:.

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

当构建使用基于Debian 8/Jessie的镜像的容器时——例如较早版本的节点:8图像 — 您可能会遇到以下错误:

...
W: 无法获取 http://deb.debian.org/debian/dists/jessie-updates/InRelease  无法在 Release 文件中找到预期的条目 'main/binary-amd64/Packages' (源列表条目错误或文件格式不正确)
E: 一些索引文件下载失败。它们已被忽略,或者使用了旧的文件代替。
...

这是一个众所周知的问题,由Debian 8被“存档”引起。较新的镜像版本通常可以解决这个问题,通常通过升级到Debian 9/Stretch。

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

  • 选项 1:移除任何依赖该镜像的容器,移除该镜像,然后再次尝试构建。这将下载一个不受该问题影响的更新镜像。参见清理未使用的容器和镜像 了解详细信息。

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

    # 如果基础镜像使用的是 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使用率com.docker.hyperkit 在活动监视器中,如果你的开发容器中几乎没有活动,你可能会遇到这个问题。请关注 Docker 问题 以获取更新和修复。

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

在远程Docker Machine或SSH主机上的容器内开发 文章涵盖了在与远程Docker主机工作时如何设置VS Code。这通常只需设置 Container Tools扩展 容器.环境物业在settings.jsonDOCKER_HOST环境变量到一个ssh://tcp://统一资源标识符。

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

使用 SSH 隧道作为备用选项

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

请按照以下步骤操作:

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

  2. 更新 容器工具扩展 容器.环境在你的用户或工作区中的属性settings.json如下所示:

    "containers.environment": {
        "DOCKER_HOST": "tcp://localhost:23750"
    }
    
  3. 在本地终端 / PowerShell 中运行以下命令(替换用户@主机名与远程用户和您的服务器的主机名/ IP地址:

    ssh -NL 本地主机:23750:/var/run/docker.sock 用户@主机名
    

VS Code 现在可以 连接到远程主机上的任何运行中的容器。您还可以 使用专门的本地 devcontainer.json 文件用于创建/连接到远程开发容器.

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

注意: 如果 安全外壳协议命令失败,您可能需要允许流本地转发在你的 SSH 主机上。

  1. 打开/etc/ssh/sshd_config在编辑器(如Vim、nano或Pico)中,在SSH主机上(而不是本地)。
  2. 添加设置 允许流本地转发 是输入:.
  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 重新安装扩展和 dotfiles。

高级容器配置提示

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

扩展提示

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

问题和反馈

报告问题

如果您在使用 Dev Containers 扩展时遇到问题,重要的是收集正确的日志,以便我们能够帮助诊断您的问题。您可以通过Dev Containers: 显示容器日志获取 Dev Containers 扩展日志。

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

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

远程问题和反馈资源

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