【问题标题】:Moving files between volumes in Docker is slow在 Docker 中的卷之间移动文件很慢
【发布时间】:2021-05-18 19:36:49
【问题描述】:

我正在以这种方式安装两卷:

    volumes:
      - /home/username/videos:/var/www/symfony/ftp
      - .docker/data/uploads/videos:/var/www/symfony/public/uploads/videos

主机上的两个文件夹在同一个分区上。如果我在主机上为/home/username/videos.docker/data/uploads/videos 之间的文件运行mv,它基本上是即时的。但是如果我在var/www/symfony/ftp/var/www/symfony/public/uploads/videos 之间运行mv,它会非常缓慢。

基本上,它似乎在复制文件,就好像它是两个完全不同的物理驱动器一样。主机运行的是 Ubuntu 20.04,Docker 镜像 Alpine 3.13。

这是预期的行为吗?如果可能的话,知道如何改进吗? (除了将两个文件夹放在同一个卷上)

【问题讨论】:

  • 我用 10 GB 的文件在 linux 中尝试过,发现主机系统和 alpine docker 容器之间没有区别。您使用的是什么主机操作系统?
  • @Stefan Fenn 这是问题所在:)

标签: linux docker docker-compose


【解决方案1】:

Linux 将这些主机挂载作为两个单独的绑定挂载实现到容器的挂载命名空间中。当您运行mv 时,它会检查是否可以在文件系统相同的情况下进行简单的重命名。不幸的是,当您遇到绑定挂载linux treats these as separate filesystems 时,即使绑定挂载的底层文件系统是相同的。

【讨论】:

    【解决方案2】:

    如果您的主机操作系统在本地驱动器上使用不同的文件系统格式,则映像在卷之间执行 mv 命令将有相当多的开销。

    Docker 尽最大努力将本地存储的数据转换为其内部编码,然后再转换回来。

    例如从 NTFS(本地卷)到 ext2(图像格式)再回到 NTFS(其他本地卷)

    Docker 尝试透明地执行此操作而不会打扰您,但在大文件上,这可能非常明显。

    对于 docker 容器,这些卷本质上是物理上不同的驱动器 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多