Docker 桌面 - 关于性能不佳的文件共享通知

Docker Desktop - Filesharing notification about poor performance

当我的 Docker 容器启动时,我收到以下通知:

Docker Desktop has detected that you shared a Windows file into a WSL 2 container, which may perform poorly. Click here for more details.

我的问题是:

  1. 这是什么意思?
  2. 什么是更好的做法/应该如何避免这种情况?
  3. 如果消息已关闭,或者我点击了“不再显示”,我如何才能获得此警告的详细信息?

如果需要,我很乐意分享 Docker 文件或 Docker-Compose 设置,但我在 SO 上或通过 Google 搜索根本找不到任何内容我在任何方向,所以我不知道从哪里开始。我假设问题出在 Docker 文件中,因为这是我们 运行 COPY 移动一些文件的地方。

Docker 版本:Docker 桌面版 2.4.0.0 (48506) 社区

操作系统:Windows 10 Pro(版本 10.0.19041)

  1. 此错误意味着从 Linux 容器访问 Windows 主机文件系统上的文件比访问 Linux 容器中已有的文件执行速度稍慢=] 文件系统。从 Linux 容器访问 Windows 文件将像访问远程文件共享上的文件一样执行。

  2. Docker 并且 Microsoft 建议通过将源文件存储在 WSL2 发行版的文件系统中(您可以将其绑定到容器)或构建容器映像以包含所有需要的文件而不是将文件存储在 Windows 文件系统中。

  3. 如果您点击了“不再显示”,您可以前往 Develop with Docker and WSL 2.

    了解此消息的详细信息

有关更多信息,Docker for Windows Best Practices 说:

  • Linux containers only receive file change events (“inotify events”) if the original files are stored in the Linux filesystem. For example, some web development workflows rely on inotify events for automatic reloading when files have changed.
  • Performance is much higher when files are bind-mounted from the Linux filesystem, rather than remoted from the Windows host. Therefore avoid docker run -v /mnt/c/users:/users (where /mnt/c is mounted from Windows).
  • Instead, from a Linux shell use a command like docker run -v ~/my-project:/sources <my-image> where ~ is expanded by the Linux shell to $HOME.

Microsoft 的 Comparing WSL 1 and WSL 2 article has a whole section on Performance across OS file systems,它的开头段落说:

We recommend against working across operating systems with your files, unless you have a specific reason for doing so. For the fastest performance speed, store your files in the WSL file system if you are working in a Linux command line (Ubuntu, OpenSUSE, etc). If you're working in a Windows command line (PowerShell, Command Prompt), store your files in the Windows file system.

此外,Docker 博客文章 Docker Desktop: WSL 2 Best practices 有一个“令人敬畏的坐骑性能”部分,内容如下:

Both your own WSL 2 distro and docker-desktop run on the same utility VM. They share the same Kernel, VFS cache etc. They just run in separate namespaces so that they have the illusion of running totally independently. Docker Desktop leverages that to handle bind mounts from a WSL 2 distro without involving any remote file sharing system. This means that when you mount your project files in a container (with docker run -v ~/my-project:/sources <...>), docker will propagate inotify events and share the same cache as your own distro to avoid reading file content from disk repeatedly.

A little warning though: if you mount files that live in the Windows file system (such as with docker run -v /mnt/c/Users/Simon/windows-project:/sources <...>), you won’t get those performance benefits, as /mnt/c is actually a mountpoint exposing Windows files through a Plan9 file share.

如果您希望您的主要开发工作流程在 Linux 中,那么所有这些建议都很棒。 Docker 希望您在 Linux 容器上“全力以赴”。但是,如果您主要在 Windows 中工作,并且只想将 Linux 容器用于特定任务,那么单击“不再显示”就可以了。正如微软所说,“如果您在 Windows 命令行中工作,请将您的文件存储在 Windows 文件系统中。”

我 运行 将我的主要开发文件夹放在 Windows 中,然后我将它绑定安装到一个 Linux 容器,该容器仅用于执行单元测试。所以我在 Windows 中完整构建 运行s,然后我在 Windows 中 运行 我所有的单元测试,最后我在 运行 中完成我所有的单元测试还有一个 Linux 容器。将 Linux 绑定挂载到我的 Windows 文件夹可以快速且非常适合这种情况,其中 Linux 中的“dotnet 测试”调用只是从我的 [=48= 加载和执行所需的 DLL ] 卷。

对于那些认为必须在任何地方都使用容器的人来说,这种设置听起来像是异端邪说,但我喜欢容器来部署应用程序。我不相信您也需要全力以赴并在容器内进行所有开发。我很高兴 Windows(和 VS 2019)作为我的开发环境,然后我使用 Linux 容器进行应用程序测试和部署。因此 Windows/WSL2 文件系统性能下降对我影响很小。