Linux主机Docker重叠绑定挂载生成root属主幽灵文件是否为预期行为?
Docker重叠绑定挂载生成root幽灵文件是预期行为吗?
这确实是预期行为,背后和Docker的挂载逻辑以及Linux的挂载机制有关,我来给你拆解一下:
为什么会生成root所有的幽灵文件?
当你执行这条命令时:
docker run --rm --volume=`pwd`/tempdir:/home --volume=`pwd`/hostfile:/home/hostfile ubuntu bash
Docker会按顺序处理挂载请求,但核心原因是Linux挂载系统的硬性要求:要挂载一个文件到某个路径,这个路径必须是一个已存在的文件(作为挂载点)。
这里的矛盾点在于,你把主机的tempdir挂载到了容器的/home,此时容器的/home完全映射为主机的tempdir。当Docker尝试把主机的hostfile挂载到容器的/home/hostfile时,发现容器的/home下并没有这个文件(因为主机的tempdir里原本就没有),于是Docker会以容器的默认用户(也就是root)的身份,在容器的/home下创建这个空的挂载点文件。而由于/home是绑定挂载到主机tempdir的,这个创建操作会直接同步到主机的tempdir目录下,最终就生成了一个root所有的空文件。
怎么避免这个问题?
- 提前在主机目录中创建好文件:在运行容器前,先执行
cp hostfile tempdir/,确保主机的tempdir里已经有hostfile,再执行挂载命令,此时Docker会直接挂载已存在的文件,不会生成幽灵文件。 - 调整挂载方式:不要同时挂载父目录和该目录下的单个文件,要么只挂载整个
tempdir到容器/home,要么把hostfile挂载到容器内非绑定挂载的路径(比如/home2/hostfile)。 - 指定容器运行用户:如果一定要保持当前挂载方式,可以添加
--user=$(id -u):$(id -g)参数让容器以当前主机用户身份运行,这样生成的挂载点文件就会属于当前用户,而不是root:docker run --rm --user=$(id -u):$(id -g) --volume=`pwd`/tempdir:/home --volume=`pwd`/hostfile:/home/hostfile ubuntu bash
内容的提问来源于stack exchange,提问作者Till Hoffmann
相关产品推荐
相关产品推荐

