我有一个使用 docker-compose.yml 启动的 docker 容器,其中包含
service: my-service
volumes:
- /tmp/mount/opt/my-app:/opt/my-app
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
但是,如果我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
Run Code Online (Sandbox Code Playgroud)
然后一切正常。
换句话说,挂载目录中的符号链接可以在容器启动后被容器读取,但在启动期间则不能读取,并且挂载该目录的非符号链接克隆就可以了。
为什么符号链接在 docker 中会有这样的行为?
Ren*_*ink 10
符号链接指向文件系统中的文件。因此docker主机文件系统中的符号链接指向该文件系统中的一个文件。
如果将该符号链接挂载到容器中,它将在容器的文件系统中进行解释。这意味着它仍然指向/opt/my-app/test1.cfg. 并且该文件在容器中不存在。
你可以挂载原来的目录,不是吗?
- /opt/my-app/:/opt/my-app
Run Code Online (Sandbox Code Playgroud)
我猜你不想挂载整个目录。您可能想要排除某些文件,这就是您创建带有符号链接的临时目录的原因。
在这种情况下,可以创建临时目录并使用硬链接,因为它们只是指向相同文件的另一个文件条目。但这只有在同一分区上创建硬链接时才有可能。请参阅硬链接和符号链接有什么区别
也许 docker 的绑定传播功能也可以帮助你。
为什么符号链接在 docker 中会有这样的行为?
这不是一个docker问题。符号链接就是这样的。
| 归档时间: |
|
| 查看次数: |
6338 次 |
| 最近记录: |