【问题标题】:`cp` vs `rsync` vs something faster`cp` vs `rsync` vs 更快的东西
【发布时间】:2017-09-09 21:35:11
【问题描述】:

我正在使用 Docker,而 Docker 无法将 COPY 符号链接文件添加到映像中。但是符号链接的文件不在“构建上下文”中。所以我打算用 cp 将它们复制到构建上下文中,但这真的很慢。有什么方法可以在磁盘上的两个不同位置共享文件,而不必复制它们并且不使用符号链接?

【问题讨论】:

  • 如果它们在同一个物理分区上,使用硬链接。
  • 请添加答案以获得最大收益

标签: linux macos docker rsync cp


【解决方案1】:

这是不允许的,也不会是

https://github.com/moby/moby/issues/1676

我们不允许这样做,因为它不可重复。您机器上的符号链接与我的机器不同,相同的 Dockerfile 会产生两种不同的结果。也有指向 /etc/paasswd 的符号链接会导致问题,因为它会链接主机文件而不是本地文件。

如果您有每个容器都需要的公共文件,那么我会将它们全部放在一个共享映像中并使用 docker multi build options

FROM mysharedimage as shared

FROM alpine
COPY --from=shared /my/common/stuff /common
....

仍然不是最优雅的解决方案,但是,因为当您执行 docker build 时,当前上下文被压缩并发送到 docker 守护程序,软链接将不起作用。

您可以创建硬链接,但硬链接指向 inode,它们不会向您显示它们指向的文件。其他上的软链接会告诉您它们指向的位置,但构建不会发送它们。

ln /source/file /dest/file

所以你的电话真的是你想做什么以及你想怎么做。

【讨论】:

  • 硬链接绝对会告诉你他们链接到哪个文件。根据定义,它们是指向文件的链接。如果/path/to/foo/path/to/bar 都链接到同一个文件,那么它们都链接到同一个文件。如果您想知道它们都指向哪个文件,请检查。从字面上看,没有理由将其中一个链接视为“真实”文件。他们都引用了同一个东西。
  • @WilliamPursell,我的意思是ls -alh 不会向您显示该文件指向其他文件。这意味着您必须检查inode 并查找其他文件是否也引用了该inode。我是否错过了这种理解中的某些东西?
  • ls -l 将显示每个文件的链接数。它(通常)是输出的第二列。我主要对您使用“其他文件”之类的短语表示例外。如果您使用ln a b 在当前目录中创建链接b,则ab 都引用同一个文件。认为a 是文件而b 是对它的引用是不正确的。 ab 是同一个文件的不同名称,它们之间除了名称没有区别。换句话说,b 并没有指向“其他文件”,而不仅仅是a。它们中的每一个都是指向文件的链接。
  • @WilliamPursell,是的,这也是我的理解。我唯一想说的是ls -alh 没有在硬链接中显示文件位置,因为它现在是一个inode 引用。所以我不确定跟踪这些位置的最简单方法是什么,所以如果一个文件在ls -al 中显示了 10 个计数,那么我怎么知道哪些所有路径都指向这个 inode。也许你能告诉我。
  • “不在硬链接中显示文件位置”是什么意思?特别是,您所说的“位置”是什么意思?我要强调的一点是/some/path/a 的位置既不比/other/path/b 多也不少。
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 2010-10-05
  • 2012-04-15
  • 2011-03-23
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多