Docker绑定挂载权限 - 以root:root的身份意外挂载

9
我有一个目录/home/foo/mydir,它的所有者是foo:foo(uid=1040),我在alpine docker映像中使用bind mount绑定该目录,命令如下:docker run -it --rm -v /home/foo/mydir:/tmp/mydir --user 1040 alpine 但是当我检查容器中的该目录时,它的所有者却变成了root:root。我是否疯了?我以为docker会传递文件权限到容器中呢?有没有任何方法可以保留权限(即使在容器中使mydir仍然属于foo:foo),而无需在容器中对其进行chown操作?

尝试使用 --user 1040:1040 吗? - anthony sottile
主机操作系统是什么?您是否在Docker守护程序上配置了用户命名空间重映射? - David Maze
无法复现 - 我尝试运行命令 docker run -it -v /home/nick:/home/nick --user 1000:1000 ubuntu bash,成功将目录挂载为 UID 1000。 - Nick ODell
在 macOS 上,--user 只有在使用旧的 "osxfs" 文件共享模式时才能正常工作,而不能在新的 gRPC FUSE 模式下使用。当我使用 "osxfs" 模式时,docker run --user ABC:XYZ … 会将 ABC:XYZ 的所有权分配给任何绑定挂载的文件和目录。 - Julian Mehnle
我有两台Ubuntu Jammy机器,其中一台出现了这个问题,但另一台没有。它们都运行相同版本的Docker和相同的配置,所以我真的很困惑是什么引起了这个问题。 - Serrano
1个回答

3
我有两台Ubuntu Jammy机器,这个问题只在一台机器上发生,而另一台机器没有。最终我找到了原因和解决方法。
显然,这个问题是由Docker Desktop引起的。在第一台机器上,我只安装了Docker引擎。第二台机器安装了Docker Desktop,它运行一个虚拟机,你的容器将在该虚拟机内运行。在这种情况下,你不能像同样地将主机目录挂载到容器中,因为你需要先将其挂载到虚拟机中。
所以解决方案很简单,只需完全删除Docker,然后仅安装Docker引擎(https://docs.docker.com/engine/install/)。
根据我的支持查询:

https://forums.docker.com/t/bind-mount-permissions-unexpected-mounting-as-root-root/129328?u=swpppp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接