docker:mount:创建中间文件夹作为root而不是hostuser



案例1:

我正在尝试在docker 中装载主机文件夹dir1/dir1

docker run --rm -it 
-v "$(pwd)/dir1":"/dir1" 
some_image /bin/bash

我认为docker内部的权限是

drwxr-xr-x 3 hostuser users 4096 Apr 18 13:51 dir1

病例2:

当我试图装载嵌套文件夹时,我看到父文件夹是用根用户创建的,只有最后一个目录具有主机用户权限

docker run --rm -it 
-v "$(pwd)/dir1/dir2":"/dir1/dir2" 
some_image /bin/bash

在这里,我看到/dir1权限在docker中作为

drwxr-xr-x 3 root root 4096 Apr 18 13:51 dir1

在这里,我看到了docker内部的/dir1/dir2权限作为

drwxr-xr-x 3 hostuser users 4096 Apr 18 13:51 dir2

我希望dir1dir2都具有hostuser users权限

我怎样才能实现这个

解决方案

docker run --rm -it 
-v "$(pwd)/dir1":"/dir1" 
-v "$(pwd)/dir1/dir2":"/dir1/dir2" 
someimage /bin/bash

我必须装载父文件夹,然后我可以作为主机用户查看其权限

dockerd引擎以root身份运行,它对运行docker进程的用户一无所知,就像web服务器不知道运行浏览器的用户的用户id一样。

控制UID的是您是否有设置用户名称空间(默认情况下是关闭的,因为它们破坏这些绑定装载的方式(,以及在容器内运行的进程的用户。如果您的容器以root用户身份运行,它将以root用户的身份创建文件,这与您在Linux上运行任何根进程完全相同。

要覆盖图像中配置的默认用户,可以传递-u标志:

docker run --rm -it 
-u "$(id -u):$(id -g)" 
-v "$(pwd)/dir1":"/dir1" 
some_image /bin/bash

但是,要意识到,映像创建者希望他们的容器使用他们配置的uid运行,并且可能需要对映像进行其他更改,以支持将容器作为不同的uid运行。我经常用docker基础仓库中的fixperms脚本制作处理此问题的图像。我调用该脚本作为入口点的一部分,以修改容器UID以匹配目录(卷装载(UID,然后运行gosu,从以root身份运行切换为以该容器用户身份运行。

还要注意,dir1应该已经预先存在于主机上。否则,docker引擎有一个功能,它将为您创建丢失的源文件夹,但不知道授予它的权限/所有权,只使用默认的根:根所有权。如果docker不这样做,绑定挂载就会失败,因为Linux要求绑定挂载源已经存在。

例外情况是,当文件系统经过某种中间层时,比如NFS进行压缩,或者Docker Desktop将主机目录与嵌入式Linux VM的主机目录同步。

最新更新