Docker Desktop 2.2+与主机卷挂载的性能极慢

8

我有一个构建过程需要大量进行文件IO操作。其中包含70k个松散的文件以及相当数量的压缩/解压缩操作。

在使用主机卷挂载的Docker Desktop 2.2+容器中运行时,该构建的性能会急剧下降。

12分钟 - 直接在Windows 10中运行

19分钟 - Docker Desktop 2.1.0.5(使用主机挂载卷 (Windows /c 驱动器)

71分钟 - Docker Desktop 2.3.0.2(使用主机挂载卷 (Windows /c 驱动器)

2分钟 - Docker Desktop 2.1.0.5(使用容器文件系统)

2分钟 - Docker Desktop 2.3.0.2(使用容器文件系统)

即使使用Docker 2.1.0.5并且使用主机卷挂载,性能也不太好。但使用DD 2.3后,从约19分钟到约71分钟的性能下降令人无法忍受。

还有其他人在文件IO密集任务中遇到这种性能问题吗?


1
你可能会发现这个讨论很有用:https://github.com/docker/for-win/issues/188 - Keegan
似乎从上面的 GH 问题来看,WSL2 或 Linux/Unison 是可行的解决方案 - WinOS 挂载似乎不是 Docker 的重点关注领域 - 即使 MacOS 也有文件系统挂载一致性标志。 - SliverNinja - MSFT
2个回答

2

由于遇到了类似的问题,我决定做一些简单的事情,相当于为开发人员提供与Docker挂载点相同的解决方案:

1- 检查容器是否具有rsync工具,如果没有则安装。

2- 通过dockerfile生成一个shell脚本文件,其中包含以下说明:

WORKDIR /var/www/html
RUN mkdir -p /folder-shared
RUN echo "#!/bin/bash" > sync-windows-files.sh
RUN echo 'while true; do' >> sync-windows-files.sh
RUN echo '  rsync -avu "/folder-shared/" "/var/www/html"' >> sync-windows-files.sh
RUN echo '  sleep 2;' >> sync-windows-files.sh
RUN echo 'done' >> sync-windows-files.sh
COPY . .

在最后一行添加命令以在后台运行:
CMD ["bash", "-c", "sh sync-windows-files.sh &]

注意:我的Web服务器查看的是/var/www/htmldockerfile应该始终位于项目根目录下,以加快进度。

3 - 准备DockerCompose.yml:

services:
  regulacao:
    container_name: shared-windows-files
    build:
      context: .
      network: host

    volumes:
      - ./:/folder-shared
    working_dir: /var/www/html/
    ports:
      - "8587:80"

解释: 这个问题的解决方法是将docker共享映射到另一个目录,本例中在构建过程中在容器镜像的根目录下创建了名为folder-shared的目录。一旦映射了目录,就可以创建一个shell脚本sync-windows-files.sh,它执行无限循环,将folder-shared共享文件夹中的文件与Web服务器指向的文件夹同步,对我来说是/var/www/html
通过这样做,问题成功解决,希望您能理解。

1
真实的故事,根据我的基准测试,混合负载(读/写)速度{{link1:慢了10倍}}。
尽管他们{{link2:承诺Linux子系统会更快}}, 但它仍然看起来是{{link3:一个灰色地带}}。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接