docker 容器在启动期间无法打开卷挂载中的符号链接文件

spr*_*aff 7 linux docker

我有一个使用 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问题。符号链接就是这样的。

另请查看在 docker 容器中使用符号链接安装主机目录