如何在Docker卷中创建到文件的硬链接

时间:2019-03-27 15:05:10

标签: docker hardlink

我正在重构和“ docker化”一个由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 / 目录中创建指向文件系统中其他文件的硬链接。 他们现在返回以下错误:

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

我尝试了符号链接,它可以工作。但是,此处选择硬链接的原因是,一旦删除了所有链接,就将其删除。

是否可以在Docker卷之间创建硬链接?

1 个答案:

答案 0 :(得分:2)

不,没有办法做你想做的事。

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

但这还不是全部。为了强制执行“无跨文件系统硬链接”限制,当您尝试创建硬链接时,内核会检查该the mounts, to which the source and the destination belong, are the same。这意味着,即使源和目标属于相同的文件系统,但也属于不同的挂载点,仍然禁止创建硬链接。< / p>

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