开发容器提示和技巧
本文包含一些技巧和窍门,可帮助您在不同的环境中启动并运行开发容器扩展。
安装 Docker 的其他方法
您可以通过以下几种方式将 Docker 与开发容器扩展一起使用:
- 本地安装的 Docker。
- 远程环境中安装的 Docker。
- 本地或远程安装的其他符合 Docker 标准的 CLI。
- 虽然其他 CLI 可能有效,但它们不受官方支持。请注意,连接到 Kubernetes 集群 只需要正确配置的 kubectl CLI。
您可以在 其他 Docker 选项文档 中了解更多信息。
Docker Desktop for Windows 提示
Docker Desktop for Windows 在大多数设置中运行良好,但也有一些“陷阱”会导致问题。以下是一些避免这些陷阱的技巧
-
**考虑在 Windows 10(2004+)上使用新的 Docker WSL 2 后端。**如果您使用的是 Docker Desktop 的 WSL 2 后端,您可以使用它打开 WSL 内部的文件夹以及本地文件夹。容器在 Windows 和 WSL 内部之间也是共享的,这个新引擎不太容易出现文件共享问题。有关详细信息,请参阅 快速入门。
-
**退出“Windows 上的 Linux 容器(LCOW)”模式。**虽然默认情况下已禁用,但 Docker 的最新版本支持 Windows 上的 Linux 容器(LCOW),它可以允许您同时使用 Windows 和 Linux 容器。但是,这是一项新功能,因此您可能会遇到问题,而开发容器扩展目前仅支持 Linux 容器。您可以随时通过右键单击 Docker 任务栏项并从上下文菜单中选择 **切换到 Linux 容器...** 来退出 LCOW 模式。
-
**确保您的防火墙允许 Docker 设置共享驱动器。**Docker 仅需在两个机器本地 IP 之间连接,但某些防火墙软件可能仍然会阻止任何驱动器共享或所需端口。有关解决此问题的后续步骤,请参阅 这篇 Docker 知识库文章。
以下是一些适用于 Docker for Windows 较旧版本但现在应该已解决的技巧。如果您遇到由于可能的回归导致的奇怪行为,这些技巧在过去解决了问题。
-
**在共享驱动器时,使用 AD 域帐户或本地管理员帐户。不要使用 AAD(基于电子邮件)帐户。**AAD(基于电子邮件)帐户存在众所周知的问题,如 Docker 文档中所述 问题 #132 和 问题 #1352。如果您必须使用 AAD 帐户,请在您的机器上创建一个单独的本地管理员帐户,仅用于共享驱动器。请按照 这篇博客文章中的步骤 进行设置。
-
**坚持使用字母数字密码以避免驱动器共享问题。**当系统要求您在 Windows 上共享驱动器时,您将被提示输入具有机器管理员权限的帐户的用户名和密码。如果您收到有关用户名或密码不正确的警告,这可能是由于密码中包含特殊字符。例如,
!
、[
和]
会导致问题。更改密码为字母数字字符以解决问题。有关详细信息,请参阅有关 Docker 卷挂载问题的这篇问题。 -
**使用您的 Docker ID 登录 Docker(而不是您的电子邮件)。**Docker CLI 仅支持使用您的 Docker ID,因此使用您的电子邮件会导致问题。有关详细信息,请参阅 Docker 文档中所述的 问题 #935。
如果您仍然遇到问题,请参阅 Docker Desktop for Windows 故障排除指南。
在 Docker Desktop 中启用文件共享
VS Code 开发容器 扩展只有在您的代码位于与 Docker 共享的文件夹或驱动器中时,才能自动将您的源代码挂载到容器中。如果您从非共享位置打开开发容器,容器将成功启动,但工作区将为空。
请注意,此步骤**不需要**使用 Docker Desktop 的 WSL 2 引擎。
要更改 Docker 的驱动器和文件夹共享设置,请执行以下操作:
Windows
- 右键单击 Docker 任务栏项,然后选择 **设置**。
- 转到 **资源 > 文件共享**,然后选中您的源代码所在的驱动器。
- 如果您看到有关本地防火墙阻止共享操作的消息,请参阅这篇 Docker 知识库文章,了解下一步操作。
macOS
- 点击 Docker 菜单栏项目,选择偏好设置。
- 转到资源 > 文件共享。确认包含源代码的文件夹位于列出的共享文件夹之一下。
解决容器中 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 镜像中没有的库。有关解决此问题的几个选项,请参阅容器文章。
加快 Docker Desktop 中的容器速度
默认情况下,Docker Desktop 只为容器提供机器容量的一小部分。在大多数情况下,这足够了,但如果您正在做一些需要更多容量的事情,您可以增加内存、CPU 或磁盘使用量。
首先,尝试停止不再使用的任何正在运行的容器。
如果这不能解决您的问题,您可能需要查看 CPU 使用量是否确实是问题,或者是否还有其他问题。一个简单的检查方法是安装资源监视器扩展。在容器中安装后,它将在状态栏中提供有关容器容量的信息。
如果您希望始终安装此扩展,请将其添加到您的settings.json
中
"dev.containers.defaultExtensions": [
"mutantdino.resourcemonitor"
]
如果您确定需要为容器提供更多机器容量,请按照以下步骤操作
- 右键单击 Docker 任务栏项目,选择设置 / 偏好设置。
- 转到高级以增加 CPU、内存或交换空间。
- 在 macOS 上,转到磁盘以增加 Docker 允许在您的机器上使用的磁盘空间。在 Windows 上,这位于其他设置下的高级选项中。
最后,如果您的容器正在执行磁盘密集型操作,或者您只是希望获得更快的响应时间,请参阅提高容器磁盘性能以获取提示。VS Code 的默认值针对方便性和通用支持进行了优化,但可以进行优化。
清理未使用的容器和镜像
如果您看到 Docker 报告您没有磁盘空间的错误,您通常可以通过清理未使用的容器和镜像来解决此问题。有几种方法可以做到这一点
选项 1:使用远程资源管理器
您可以通过选择远程资源管理器,右键单击要删除的容器,然后选择删除容器来删除容器。
但是,这不会清理您可能下载的任何镜像,这些镜像可能会占用您的系统空间。
选项 2:使用 Docker 扩展
-
在 VS Code 中打开一个本地窗口(文件 > 新窗口)。
-
如果尚未安装,请从扩展视图中安装Docker 扩展。
-
然后,您可以转到 Docker 视图,展开容器或镜像节点,右键单击,然后选择删除容器/镜像。
选项 3:使用 Docker CLI 选择要删除的容器
- 打开一个本地终端/命令提示符(或在 VS Code 中使用本地窗口)。
- 键入
docker ps -a
以查看所有容器的列表。 - 从该列表中键入
docker rm
以删除容器。 - 键入
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
- 打开一个本地终端/命令提示符(或在 VS Code 中使用本地窗口)。
- 转到包含您的
docker-compose.yml
文件的目录。 - 键入
docker-compose down
以停止并删除容器。如果您有多个 Docker Compose 文件,可以使用-f
参数指定其他 Docker Compose 文件。
选项 4:删除所有未运行的容器和镜像
- 打开一个本地终端/命令提示符(或在 VS Code 中使用本地窗口)。
- 键入
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 中的任何
apt
或apt-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问题 #935。
作为解决方法,使用您的 Docker ID 登录 Docker,而不是您的电子邮件。
macOS 上 Hyperkit 的高 CPU 使用率
存在Docker for Mac 的已知问题,会导致高 CPU 占用。特别是,在监视文件和构建时会发生高 CPU 使用率。如果您在 Activity Monitor 中看到com.docker.hyperkit
的 CPU 使用率很高,而您的开发容器几乎没有活动,则您很可能遇到了此问题。请关注Docker 问题以获取更新和修复。
使用 SSH 隧道连接到远程 Docker 主机
在远程 Docker Machine 或 SSH 主机上的容器内部开发文章介绍了在使用远程 Docker 主机时如何设置 VS Code。这通常与在settings.json
中设置Docker 扩展的docker.environment
属性或将DOCKER_HOST
环境变量设置为ssh://
或tcp://
URI 一样简单。
但是,您可能会遇到由于 SSH 配置复杂性或其他限制而导致此方法在您的环境中无法正常工作的情况。在这种情况下,可以使用 SSH 隧道作为后备方案。
使用 SSH 隧道作为后备方案
您可以设置 SSH 隧道,并将 Docker 套接字从您的远程主机转发到您的本地机器。
按照以下步骤操作
-
更新您的用户或工作区
settings.json
中的Docker 扩展的docker.environment
属性,如下所示"docker.environment": { "DOCKER_HOST": "tcp://127.0.0.1:23750" }
-
从本地终端/PowerShell 运行以下命令(将
user@hostname
替换为服务器的远程用户和主机名/IP)ssh -NL localhost:23750:/var/run/docker.sock user@hostname
现在,VS Code 将能够连接到远程主机上的任何正在运行的容器。您也可以使用专门的本地devcontainer.json
文件来创建/连接到远程开发容器。
完成后,在终端/PowerShell 中按Ctrl+C关闭隧道。
注意:如果
ssh
命令失败,您可能需要在 SSH 主机上AllowStreamLocalForwarding
。
- 在SSH 主机(而不是本地)上,在编辑器(如 Vim、nano 或 Pico)中打开
/etc/ssh/sshd_config
。- 添加设置
AllowStreamLocalForwarding yes
。- 重启 SSH 服务器(在 Ubuntu 上,运行
sudo systemctl restart sshd
)。- 重试。
持久化用户配置文件
您可以使用mounts
属性在重建过程中保留用户配置文件(以保留诸如 shell 历史记录之类的内容)。
"mounts": [
"source=profile,target=/root,type=volume",
"target=/root/.vscode-server,type=volume"
],
上面的代码首先创建一个名为profile
的命名卷,并将其装载到/root
,它将在重建时保留。接下来,它创建一个匿名卷,将其装载到/root/.vscode-server
,该卷将在重建时被销毁,这允许 VS Code 重新安装扩展和点文件。
高级容器配置提示
有关以下主题的信息,请参阅高级容器配置文章
- 添加环境变量
- 添加另一个本地文件装载
- 更改或删除默认源代码装载
- 提高容器磁盘性能
- 向开发容器中添加非 root 用户
- 为 Docker Compose 设置项目名称
- 从容器内部使用 Docker 或 Kubernetes
- 一次连接到多个容器
- 在远程 Docker Machine 或 SSH 主机上的容器内部开发
- 减少 Dockerfile 构建警告
- 与容器共享 git 凭据
扩展提示
虽然许多扩展可以在不修改的情况下工作,但有一些问题会阻止某些功能按预期工作。在某些情况下,您可以使用另一个命令来解决问题,而在其他情况下,可能需要修改扩展。远程扩展提示部分提供了常见问题的快速参考以及解决这些问题的提示。您还可以参阅有关支持远程开发的主要扩展文章,以获取有关修改扩展以支持远程扩展主机的深入指南。
问题和反馈
报告问题
如果您在使用 Dev Containers 扩展时遇到问题,请务必收集正确的日志,以便我们能够诊断您的问题。您可以使用Dev Containers: Show Container Log获取 Dev Containers 扩展日志。
如果您在远程使用其他扩展时遇到问题(例如,其他扩展在远程环境中无法正常加载或安装),请从 **远程扩展主机** 输出通道(**输出:关注输出视图**)获取日志,然后从下拉菜单中选择 **日志(远程扩展主机)**。
**注意**:如果您只看到 **日志(扩展主机)**,则这是本地扩展主机,远程扩展主机未启动。这是因为日志通道仅在日志文件创建后才创建,因此如果远程扩展主机未启动,则未创建远程扩展主机日志文件,并且未在输出视图中显示。这仍然是您在问题中包含的有用信息。
远程问题和反馈资源
我们有各种其他远程资源
- 在 Stack Overflow 上搜索。
- 添加 功能请求 或 报告问题。