gpt4 book ai didi

linux - docker容器在启动期间无法在卷挂载中打开符号链接(symbolic link)文件

转载 作者:行者123 更新时间:2023-12-02 19:46:40 68 4
gpt4 key购买 nike

我有一个使用 docker-compose.yml 启动的 docker 容器,其中包含

service: my-service
volumes:
- /tmp/mount/opt/my-app:/opt/my-app
/tmp/mount/opt 中有符号链接(symbolic link)例如 /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 bashcat /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
然后一切正常。
换句话说,挂载目录中的符号链接(symbolic link)可以在容器启动后读取,但不能在启动期间读取,并且挂载目录的非符号链接(symbolic link)克隆是可以的。
为什么符号链接(symbolic link)在 docker 中的行为是这样的?

最佳答案

符号链接(symbolic link)指向文件系统中的文件。因此 docker 主机文件系统中的符号链接(symbolic link)指向该文件系统中的文件。
如果将该符号链接(symbolic link)挂载到容器中,它将在容器的文件系统中进行解释。这意味着它仍然指向 /opt/my-app/test1.cfg .并且该文件在容器中不存在。
您可以挂载原始目录,不是吗?

- /opt/my-app/:/opt/my-app
我猜你不想挂载整个目录。您可能想要排除一些文件,这就是您创建带有符号链接(symbolic link)的临时目录的原因。
在这种情况下,可以创建临时目录并使用硬链接(hard link),因为它们只是指向相同文件的另一个文件条目。但这只有在硬链接(hard link)是在同一个分区上创建时才有可能。
What is the difference between a hard link and a symbolic link
也许 docker 的 bind-propagation能力也可以帮助你。

Why are symlinks behaving like this in docker?


这不是 docker 问题。符号链接(symbolic link)就是这样表现的。
也看看 Mount host directory with a symbolic link inside in docker container

关于linux - docker容器在启动期间无法在卷挂载中打开符号链接(symbolic link)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63099376/

68 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com