这个错误意味着从Linux容器访问Windows主机文件系统中的文件将比访问已经在Linux文件系统中的文件慢一些。从Linux容器访问Windows文件将像访问远程文件共享一样。
Docker和Microsoft建议通过将源文件存储在WSL2发行版的文件系统中(您可以将其绑定到容器中)或构建包含所有所需文件的容器映像来避免此问题,而不是将文件存储在Windows文件系统中。
如果您点击了“不再显示”,则可以通过转到使用Docker和WSL 2进行开发来查看此消息的详细信息。
有关更多信息,请参见Docker for Windows最佳实践:
- 仅当原始文件存储在Linux文件系统中时,Linux容器才会接收文件更改事件(“inotify事件”)。例如,某些Web开发工作流程依赖于inotify事件以进行文件更改自动重新加载。
- 当文件从Linux文件系统中绑定挂载时,性能要高得多,而不是从Windows主机进行远程操作。因此,避免使用
docker run -v /mnt/c/users:/users
(其中/mnt/c是从Windows挂载的)。
- 相反,从Linux shell使用类似
docker run -v ~/my-project:/sources <my-image>
的命令,其中~由Linux shell扩展为$HOME。
Microsoft的比较WSL 1和WSL 2文章有一个完整的跨操作系统文件系统的性能部分,其开头段落说:
我们建议不要跨操作系统处理您的文件,除非您有特定的原因。如果您正在Linux命令行(Ubuntu、OpenSUSE等)中工作,请将文件存储在WSL文件系统中以获得最快的性能速度。如果您正在Windows命令行(PowerShell、命令提示符)中工作,请将文件存储在Windows文件系统中。
此外,Docker博客文章Docker Desktop:WSL 2最佳实践有一个“Awesome mounts performance”部分,其中提到:
你自己的WSL 2发行版和docker桌面应用程序都在同一个实用程序VM上运行。它们共享相同的内核、VFS缓存等。它们只是在不同的命名空间中运行,以便他们有独立运行的幻觉。Docker桌面应用程序利用这一点来处理来自WSL 2发行版的绑定挂载,而不涉及任何远程文件共享系统。这意味着当您在容器中挂载项目文件(使用
docker run -v ~/my-project:/sources <...>
)时,docker将传播inotify事件并共享与您自己的发行版相同的缓存,以避免反复从磁盘读取文件内容。
不过要小心:如果您挂载的是位于Windows文件系统中的文件(例如使用
docker run -v /mnt/c/Users/Simon/windows-project:/sources <...>
),您将无法获得这些性能优势,因为/mnt/c实际上是通过Plan9文件共享公开Windows文件的挂载点。
如果您希望主要的开发工作流程在Linux上,则所有这些建议都非常好。Docker希望您完全投入Linux容器。但是,如果您主要在Windows上工作,并且只想使用Linux容器进行特殊任务,那么单击“不再显示”就可以了。正如Microsoft所说,“如果您在Windows命令行中工作,请将文件存储在Windows文件系统中。”
我在Windows中运行我的主要开发文件夹,并将其绑定挂载到一个Linux容器中,该容器仅用于执行单元测试。因此,我的完整构建在Windows中运行,然后我在Windows中运行所有单元测试,最后在Linux容器中运行所有单元测试。在这种情况下,Linux绑定到我的Windows文件夹,对于从我的Windows卷加载和执行所需的DLL的“dotnet test”调用非常快且非常好。
对于那些认为容器必须在任何地方使用的人来说,这个设置可能听起来像异端邪说,但我喜欢容器用于应用程序部署。我并不确信您需要全力以赴并在容器内进行所有开发。我很满意Windows(和VS 2019)作为我的开发环境,然后我使用Linux容器进行应用程序测试和部署。因此,Windows/WSL2文件系统性能影响对我来说是最小的影响。