如何在 docker 卷中创建硬 link 文件

How to create hard link to file in a docker volume

我正在重构 "dockerizing" 由 shell 脚本、C++ 二进制文件和各种开源包(其中 httpd)

有没有办法在 docker 容器中创建硬链接到位于 docker 卷中的文件?

我计划按如下方式构建容器:

services:
  legacy-app:
    image: my-legacy-app
    volumes:
      - http-files:/var/www/html/

  httpd:
    image: httpd:2.4
    volumes:
      - http-files:/usr/local/apache2/htdocs/

volumes:
  http-files:

遗留应用程序中的一些初始化脚本在 /var/www/html/ 目录中创建指向文件系统中其他文件的硬链接。 他们现在 return 以下错误 :

ln: creating hard link `/var/www/html/1/application' to `/home/conf/application': Invalid cross-device link

我尝试使用符号链接,它有效。然而,这里选择硬链接的原因是一旦所有链接都被删除,文件就会被删除。

有没有办法跨 docker 个卷创建硬链接?

不行,没有办法如你所愿。

问题是 Linux 禁止跨不同文件系统的硬 links。在你的例子中,/home/conf/application 属于容器的根文件系统,它挂载在 / (它可能是 overlay 挂载,或 aufs,或其他),而卷(/var/www/html/ 和该目录下的所有内容)属于另一个文件系统,位于主机的 /var/lib/docker 目录下(或您的卷位于主机上的任何位置)。

但这还不是全部。为了强制执行 "no cross-filesystem hard links" 限制,当您尝试创建硬 link 时,内核会检查 the mounts, to which the source and the destination belong, are the same。这意味着,即使源和目标属于同一个文件系统,但也属于不同的挂载点,创建硬盘link 仍然被禁止。

结果是您无法在不同的 Docker 卷之间创建硬 link,即使这些卷属于同一文件系统。最后,即使你将同一个卷挂载到容器中的不同位置,你仍然不能在这些位置之间创建硬link,因为它们仍然属于不同的挂载。