开发容器提示和技巧
本文包括一些在不同环境中启动和运行 Dev Containers 扩展的提示和技巧。
安装Docker的替代方法
您可以使用Docker与Dev Containers扩展,有几种方式,包括:
- Docker 已在本地安装。
- 在远程环境中安装了Docker。
- 其他符合Docker标准的本地或远程安装的CLIs。
- 虽然其他 CLIs 可能可以工作,但它们不受官方支持。请注意,连接到一个 Kubernetes 集群只需要一个正确配置的kubectl CLI。
您可以在 替代Docker选项文档 中了解更多信息。
定制 AI 聊天回复
自定义指令使您能够描述通用指南或规则,以获得符合您的特定编码实践和技术栈的响应。
您可以使用自定义指令与开发容器,以向 Copilot 提供有关您连接的开发容器类型更多信息(例如安装了哪些语言或工具链)。您可以通过几种方式实现这一点:
- 添加
"github.copilot.chat.codeGeneration.instructions"直接在你的devcontainer.json - 使用一个
Copilot指令.md文件就像你在本地一样
Docker Windows 桌面版小贴士
Docker Desktop 在大多数 Windows 环境下运行良好,但有几个“陷阱”可能会导致问题。以下是一些避免这些问题的提示:
-
考虑在 Windows 10 (2004+) 上使用新的 Docker WSL 2 后端。 如果你正在使用 Docker Desktop 的 WSL 2 后端,你不仅可以使用它在WSL内打开文件夹,还可以在本地打开。容器在 Windows 和 WSL 内也是共享的,这个新引擎对文件共享问题的抵抗力更强。详见 快速入门。
-
切换出“Linux Containers on Windows (LCOW)”模式。 虽然默认禁用,但最新版本的Docker支持Linux Containers on Windows (LCOW),这可以允许你同时使用Windows和Linux容器。然而,这是一个新功能,所以你可能会遇到一些问题,并且Dev Containers扩展目前只支持Linux容器。你可以随时右键单击Docker任务栏图标,从上下文菜单中选择切换到Linux容器...来切换出LCOW模式。
-
确保你的防火墙允许Docker设置共享驱动器。Docker只需要在两台机器的本地IP之间进行连接,但某些防火墙软件可能会仍然阻止任何驱动器共享或所需的端口。
这里有一些适用于 Windows 版本的旧版Docker的提示,但这些问题现在应该已经解决。如果你遇到由于可能的回归而产生的奇怪行为,这些提示在过去已经解决了问题。
-
在共享驱动器时,请使用AD域账户或本地管理员账户。不要使用AAD(基于电子邮件的)账户。AAD(基于电子邮件的)账户有已知问题,如在Docker中记录的问题 #132和问题 #1352。如果必须使用AAD账户,请在您的机器上创建一个单独的本地管理员账户,专门用于共享驱动器的目的。按照这篇文章中的步骤进行设置。
-
请使用字母数字密码,以避免驱动器共享问题。 在Windows系统中被要求共享驱动器时,系统会提示您输入具有机器管理员权限的账户名和密码。如果收到用户名或密码错误的警告,这可能是由于密码中包含特殊字符。例如,
!,输入:[和输入:]已知会导致问题。将您的密码更改为字母数字字符以解决此问题。请参阅此关于 Docker 卷挂载问题 的详细信息。 -
使用你的Docker ID登录Docker(不是你的邮箱)。 Docker CLI仅支持使用你的Docker ID,因此使用你的邮箱可能会导致问题。请参阅Docker问题 #935了解详情。
如果您仍然遇到问题,请参阅Docker Windows 桌面版故障排除指南。
在Docker Desktop中启用文件共享
VS CodeDev Containers扩展只能自动将您的源代码挂载到容器中,如果您的代码位于与Docker共享的文件夹或驱动器中。如果您从非共享位置打开一个开发容器,容器将成功启动,但工作区将是空的。
请注意,这一步不是必需的,使用Docker Desktop 的 WSL 2 引擎。
要更改Docker的驱动器和文件夹共享设置:
Windows:
- 右键单击Docker任务栏图标,选择设置。
- 前往 资源 > 文件共享 并检查包含您的源代码的驱动器。
- 如果你看到有关于你的本地防火墙阻止共享操作的消息,请参阅此Docker KB文章以获取下一步操作。
macOS:
- 点击Docker菜单栏项目并选择首选项.
- 前往 资源 > 文件共享。确认包含您的源代码的文件夹在列出的共享文件夹之一下。
在容器中解决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"
]
如果您确定需要增加容器在机器上的容量,请按照以下步骤操作:
- 右键单击Docker任务栏项目,选择设置 / 首选项。
- 前往高级以增加CPU、内存或交换空间。
- 在 macOS 上,前往 磁盘 以增加 Docker 在你机器上允许消耗的磁盘空间。在 Windows 上,这位于其他设置下的高级选项中。
最后,如果你的容器正在进行磁盘密集型操作,或者你只是希望获得更快的响应时间,请参阅提高容器磁盘性能以获取提示。VS Code 的默认设置优化了便利性和通用支持,但可以进行优化。
清理未使用的容器和镜像
如果你看到Docker报告说你没有磁盘空间,通常可以通过清理未使用的容器和镜像来解决这个问题。有几种方法可以做到这一点:
选项 1:使用远程浏览器
您可以通过选择远程资源管理器,右键单击要删除的容器,并选择删除容器来删除容器。

然而,这并不能清理你可能下载的任何图像,这可能会使你的系统变得混乱。
选项2:使用Container Tools扩展
-
打开一个本地Windows在VS Code中 (文件 > 新Windows).
-
安装容器工具扩展,如果尚未安装。
-
然后你可以进入容器浏览器,展开容器或镜像节点,右键单击并选择移除容器/镜像。

选项3:使用Docker CLI选择容器进行删除
- 打开一个本地终端/Commands提示符(或在 VS Code 中使用本地Windows)。
- 类型
docker ps -a查看所有容器的列表。 - 类型
docker rm <容器 ID>从这个列表中删除一个容器。 - 类型
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
- 打开一个本地终端/Commands提示符(或在 VS Code 中使用本地Windows)。
- 请将以下文本翻译成中文: Go to the directory with your
docker-compose.yml文件。 - 类型
docker-compose 停止停止并删除容器。如果你有多个Docker Compose文件,你可以通过指定额外的Docker Compose文件来实现。-输入:f争论。
选项 4: 删除所有未运行的容器和镜像:
- 打开一个本地终端/Commands提示符(或在 VS Code 中使用本地Windows)。
- 类型
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.json或DOCKER_HOST环境变量到一个ssh://或tcp://统一资源标识符。
然而,由于SSH配置的复杂性或其他限制,在某些环境中这可能无法正常工作。在这种情况下,可以使用SSH隧道作为备用方案。
使用 SSH 隧道作为备用选项
您可以设置 SSH 隧道并将远程主机上的 Docker 套接字转发到本地机器。
请按照以下步骤操作:
-
安装一个兼容 OpenSSH 的 SSH 客户端。
-
更新 容器工具扩展
容器.环境在你的用户或工作区中的属性settings.json如下所示:"containers.environment": { "DOCKER_HOST": "tcp://localhost:23750" } -
在本地终端 / PowerShell 中运行以下命令(替换
用户@主机名与远程用户和您的服务器的主机名/ IP地址:ssh -NL 本地主机:23750:/var/run/docker.sock 用户@主机名
VS Code 现在可以 连接到远程主机上的任何运行中的容器。您还可以 使用专门的本地 devcontainer.json 文件用于创建/连接到远程开发容器.
完成后,按Ctrl+C在终端 / PowerShell中关闭隧道。
注意: 如果
安全外壳协议命令失败,您可能需要允许流本地转发在你的 SSH 主机上。
- 打开
/etc/ssh/sshd_config在编辑器(如Vim、nano或Pico)中,在SSH主机上(而不是本地)。- 添加设置
允许流本地转发 是输入:.- 重启SSH服务器(在Ubuntu上,运行
请将以下网页文本翻译成中文,只输出翻译结果,不输出任何其他解释,若文本已经是中文了,则直接用中文复述一遍。翻译结果保持格式不变。输入:sudo systemctl restart sshd)。- 重试。
持久化用户配置文件
你可以使用安装属性以在重建开发容器时保持用户配置文件(例如 shell 历史记录)不丢失。
"mounts": [
"source=profile,target=/root,type=volume",
"target=/root/.vscode-server,type=volume"
],
上面的代码首先创建一个名为的命名卷个人资料安装到/根目录,这将能够在一个重建中存活下来。它接下来创建一个匿名卷挂载到/root/.vscode-server在重建时会被销毁,这允许 VS Code 重新安装扩展和 dotfiles。
高级容器配置提示
请参阅高级容器配置文章,了解以下主题的信息:
- 添加环境变量
- 添加另一个本地文件挂载
- 更改或移除默认的源代码挂载
- 提升容器磁盘性能
- 将非根用户添加到你的开发容器中
- 为Docker Compose设置项目名称
- 在容器内部使用Docker或Kubernetes
- 同时连接多个容器
- 在远程Docker Machine或SSH主机上的容器内开发
- 减少Dockerfile构建警告
- 与容器共享 git 凭据
扩展提示
虽然许多扩展可以在不修改的情况下工作,但也有一些问题可能会阻止某些功能按预期工作。在某些情况下,您可以使用另一个命令来解决该问题,而在其他情况下,可能需要修改扩展。 远程扩展提示部分提供了常见问题和解决它们的提示的快速参考。您还可以参考 支持远程开发 主扩展文章中的修改扩展以支持远程扩展主机的深入指南。
问题和反馈
报告问题
如果您在使用 Dev Containers 扩展时遇到问题,重要的是收集正确的日志,以便我们能够帮助诊断您的问题。您可以通过Dev Containers: 显示容器日志获取 Dev Containers 扩展日志。
如果你在远程使用其他扩展时遇到问题(例如,其他扩展在远程上下文中无法正常加载或安装),从远程扩展主机输出通道(输出:聚焦输出视图)获取日志,并选择日志(远程扩展主机)从下拉菜单中。
注意:如果您只看到Log (扩展主机),这是本地扩展主机,而远程扩展主机没有启动。这是因为日志通道只有在日志文件创建后才会创建,所以如果远程扩展主机没有启动,远程扩展主机日志文件将不会创建,并且不会在输出视图中显示。这仍然是包含在您的问题中的有用信息。
远程问题和反馈资源
我们有各种其他远程资源:
- 在 Stack Overflow 上搜索。
- 添加一个功能请求或报告一个问题。