案例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
我希望dir1
和dir2
都具有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的主机目录同步。