如何在 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,因为它们仍然属于不同的挂载。
我正在重构 "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,因为它们仍然属于不同的挂载。