我正在重构和“ 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卷之间创建硬链接?
答案 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 属于不同的装载。