我有一个docker容器,该容器是通过docker-compose.yml启动的,其中包含
service: my-service
volumes:
- /tmp/mount/opt/my-app:/opt/my-app
/tmp/mount/opt
中有符号链接,例如/tmp/mount/opt/my-app/test1.cfg
指向/host/path/test1.cfg
容器启动时,它失败并显示以下错误:
my-service | Failed to stat config file "/opt/my-app/test1.cfg": No such file or directory
但是,如果我docker exec -ti the_same_container bash
和cat /opt/my-app/test1.cfg
,那么我看到的正是预期的内容。
如果在主机上,我也运行cp -r -L /tmp/mount /tmp/mount_copy
并修改yml
service: my-service
volumes:
- /tmp/mount_copy/opt/my-app:/opt/my-app
然后一切正常。
换句话说,容器 启动后,容器中可以读取已安装目录中的符号链接,但在期间不能读取该链接,并安装一个非符号链接的克隆目录很好。
为什么符号链接在docker中的行为如此?
答案 0 :(得分:0)
符号链接指向文件系统中的文件。因此,docker主机文件系统中的符号链接指向该文件系统中的文件。
如果将该符号链接安装到容器中,则它将在容器的文件系统中解释。这意味着它仍然指向/opt/my-app/test1.cfg
。而且该文件在容器中不存在。
您可以挂载原始目录,对吗?
- /opt/my-app/:/opt/my-app
我想您不想挂载整个目录。您可能要排除一些文件,这就是为什么创建带有符号链接的临时目录的原因。
在这种情况下,可以创建temp目录并使用硬链接,因为它们只是指向相同文件的另一个文件条目。但这仅在硬链接是在同一分区上创建的情况下才有可能。 参见What is the difference between a hard link and a symbolic link
也许docker的bind-propagation功能也可以为您提供帮助。
为什么符号链接在docker中的行为如此?
这不是docker问题。符号链接就是那样。
还可以看看Mount host directory with a symbolic link inside in docker container