我正在进行重构和“文档化”,这是一个由shell脚本、C++二进制文件和各种开源包(其中包括httpd)组成的遗留应用程序。
有方法在码头容器中创建指向停靠卷中文件的硬链接吗?
我计划按以下方式设计容器:
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:遗留应用程序中的一些init脚本在/var/www/html/目录中创建硬链接,指向文件系统中的其他文件。它们现在返回以下错误:
ln: creating hard link `/var/www/html/1/application' to `/home/conf/application': Invalid cross-device link我试着用符号链接,它起作用了。但是,在这里选择硬链接的原因是,一旦所有指向它的链接都被删除,文件就会被删除。
有没有一种方法可以在码头上创建硬链接?
发布于 2019-03-27 22:45:14
不,没有办法做你想做的事。
问题是Linux禁止跨不同文件系统的硬链接。在您的示例中,/home/conf/application属于容器的根文件系统,它被挂载在/ (可能是overlay挂载,或aufs或其他什么东西),而卷(/var/www/html/和该目录下的所有内容)属于另一个文件系统,该文件系统位于主机的/var/lib/docker目录下(或卷位于主机的任何位置)。
但这还不是全部。要强制执行“无跨文件系统硬链接”限制,当您尝试创建硬链接时,内核会检查, to which the source and the destination belong, are the same。这意味着,即使源和目标属于同一个文件系统,但也属于不同的挂载点,硬链接的创建仍然是被禁止的。
其结果是您无法在不同的Docker卷之间创建硬链接,即使这些卷属于同一个文件系统。最后,即使您将相同的卷安装到容器中的不同位置,仍然不能在这些位置之间创建硬链接,因为它们仍然属于不同的挂载。
https://stackoverflow.com/questions/55380443
复制相似问题