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

时间:2020-07-26 11:16:31

标签: linux docker

我有一个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 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

然后一切正常。

换句话说,容器 启动后,容器中可以读取已安装目录中的符号链接,但在期间不能读取该链接,并安装一个非符号链接的克隆目录很好。

为什么符号链接在docker中的行为如此?

1 个答案:

答案 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

相关问题