我在Docker容器中运行一个应用程序,并将其整个app-data目录公开给主机。容器中的app-data目录包含许多文件和目录,也是一个logs子目录,我希望对其进行不同的处理,并将其映射到主机上的另一个磁盘分区。我的docker-compose.yml现在包含以下内容:
volumes:
- /mnt/app:/var/app-data
- /tmp/logs:/var/app-data/logs虽然这似乎有效,但我遇到了一个我不明白的副作用。启动应用程序后,/tmp/logs目录正确地包含应用程序日志,但/mnt/app目录现在包含一个空的logs目录:
drwxr-xr-x. 2 root root 4096 Dec 1 10:47 logs这个空目录从何而来?这是预期的码头行为和完全安全的部署方式吗?
发布于 2022-12-01 11:49:56
这个空目录需要作为嵌套挂载的挂载点。
第一个重要的细节是Docker在内部按照容器路径对所有挂载进行排序,并按顺序挂载它们。因此,/var/app-data挂载是在Docker开始考虑/var/app-data/logs目录之前完成的。
当Docker执行绑定挂载时,它使用Linux 挂载(2)系统调用。Docker需要告诉内核要挂载什么以及在哪里挂载它。如果挂载点不存在,Docker首先创建它。
在您的场景中,在挂载/var/app-data之后,目录/var/app-data/logs不存在,所以Docker在实际挂载之前创建目录。但是,当它创建目录时,外部目录已经被挂载,所以当它创建目录时,它也会在主机系统上创建它。
这是使用嵌套挂载的正常结果,无需担心。
https://stackoverflow.com/questions/74640062
复制相似问题