Docker 容器在不同的 linux 主机上给出不同的 ls -f (readdir) 结果

Docker container gives different ls -f (readdir) results on different linux hosts

我们正尝试使用 docker 容器使我们的软件构建在基线环境中可重复。构建工具链(Wind River)中的工具之一称为 mkromfs,它抓取特定文件夹中的文件,将它们转换为文件系统,然后可加载到目标平台(这是一个嵌入式设备,但这并不重要)上的 rom这里)。问题是:该实用程序依赖于文件的文件系统顺序,当我 运行 RHEL 主机上的容器时给出不同的结果,当我在 Linux 中 运行 时给出不同的结果VM(Docker for Windows 启用了 Linux 容器支持,我不知道里面有什么 Linux 发行版...)。基本上可以通过生成包含文件 ab 的文件夹,然后执行 ls -f[=30 来快速复制相同的内容=] 在文件夹上,不同的主机以不同的顺序提供文件(尽管结果似乎在特定主机上是可重复的)。

我们使用的容器是基于ubuntu最新的,但是如果我尝试其他基础镜像也会出现同样的问题,它似乎依赖于主机系统,而不是容器(我的猜测是它实际上使用了主机文件系统不知何故,但我认为 dockers 使用 union FS)。

当然,我不想冒这样的风险,即将来有人会尝试在略有不同的 Linux 主机上重复构建并得出不同的结果。我也明白 ls -f (或 readdir() 内部)的顺序是由 OS 和文件系统给出的。我也无法更改 mkromfs 实用程序,因为没有可用的源代码。

到目前为止我的尝试和想法是:

  • 容器中有一个文件夹,里面有可预测的文件系统(至少是同一个文件系统),所以我想挂载 ramfs 或 tmpfs 之类的东西,不幸的是,这在容器中似乎是不允许的(拒绝提供权限)
  • 破解我们的 romfs 内容使其成为一个文件,这样排序就无关紧要了(我不喜欢这个,因为这意味着由于集成技术而修改我们的最终产品,这是我的最后手段。 ..)
  • 切换到虚拟机以实现可重复性。 (我绝对想避免这种情况,容器更小更快...)
  • 添加用于 docker 图像的文件系统的要求,我们使用的 RHEL 机器在 ext3 文件系统上有它,我还没有尝试过,而且我不确定这是否有帮助,而且我仍然不知道 Linux Windows Docker 中的 VM 主机使用什么文件系统或如何弄清楚...

有什么方法可以保存 docker 容器方法并使此过程可重复吗?理想情况下,在远程 Linux 主机上的容器中构建 运行 与在我的 Windows 10 机器 运行ning Docker 和 Linux 支持。我是整个 docker 容器技术的新手,部分也是 Linux,我一定错过了一些东西...

我已经找到适合我的情况的解决方案,这里是以防将来其他人需要它:

docker run -t -d --mount type=tmpfs,destination=/build myimage

这样容器中的 /build 目录在所有机器上使用相同的文件系统(至少到目前为止看起来是这样)。有关更多信息,请访问 https://docs.docker.com/storage/tmpfs/

通过此更改,ls -f 和实用程序提供相同的结果。