Docker 容器如何使用通过组成员身份授予的权限写入已安装的目录?
How can Docker container write to a mounted directory with permissions granted through group membership?
版本
- 主机OS:Debian 4.9.110
- Docker版本:18.06.1-ce
场景
我有一个目录,其中多个用户(user-a
和 user-b
)通过公共组成员资格(shared
)具有 read/write 访问权限,通过 chown
:
/media/disk-a/shared/$ ls -la
drwxrwsr-x 4 user-a shared 4096 Oct 7 22:21 .
drwxrwxr-x 7 root root 4096 Oct 1 19:58 ..
drwxrwsr-x 5 user-a shared 4096 Oct 7 22:10 folder-a
drwxrwsr-x 3 user-a shared 4096 Nov 10 22:10 folder-b
UID 和 GID 如下:
uid=1000(user-a) gid=1000(user-a) groups=1000(user-a),1003(shared)
uid=1002(user-b) gid=1002(user-b) groups=1002(user-b),1003(shared)
相关的 /etc/group
看起来像这样:
shared:x:1003:user-a,user-b
当su
访问两个用户时,可以在共享目录中按预期创建文件。
共享目录通过挂载绑定到 /shared/
附加到 Docker 容器。 Docker 容器作为 user-b
运行(使用 --user "1002:1002"
参数)
$ ps aux | grep user-b
user-b 1347 0.2 1.2 1579548 45740 ? Ssl 17:47 0:02 entrypoint.sh
id
从容器中打印以下内容,对我来说还不错的结果:
I have no name!@7a5d2cc27491:/$ id
uid=1002 gid=1002
同时 ls -la
完美地镜像了它的主机系统:
I have no name!@7a5d2cc27491:/shared ls -la
total 16
drwxrwsr-x 4 1000 1003 4096 Oct 7 20:21 .
drwxr-xr-x 1 root root 4096 Oct 8 07:58 ..
drwxrwsr-x 5 1000 1003 4096 Oct 7 20:10 folder-a
drwxrwsr-x 3 1000 1003 4096 Nov 10 20:10 folder-b
问题
在容器中,我无法向共享目录写入任何内容。对于 touch test
,我得到以下信息,即:
I have no name!@7a5d2cc27491:/shared$ touch test
touch: cannot touch 'test': Permission denied
我可以写入 直接 由 user-b
(用户和组)拥有并挂载到容器的目录...只是组成员似乎不知何故根本不被尊重
我已经研究过 user namespace remapping 之类的东西,但这些似乎是针对此处不适用的东西的解决方案。我想念什么?
您的容器用户有 gid=1002
,但不是组 shared
和 gid=1003
的成员。
除了 --user "1002:1002"
,您还需要 --group-add 1003
。
允许容器用户访问 gid=1003
.
的共享文件夹
id
应该显示:
I have no name!@7a5d2cc27491:/$ id
uid=1002 gid=1002 groups=1003
版本
- 主机OS:Debian 4.9.110
- Docker版本:18.06.1-ce
场景
我有一个目录,其中多个用户(user-a
和 user-b
)通过公共组成员资格(shared
)具有 read/write 访问权限,通过 chown
:
/media/disk-a/shared/$ ls -la
drwxrwsr-x 4 user-a shared 4096 Oct 7 22:21 .
drwxrwxr-x 7 root root 4096 Oct 1 19:58 ..
drwxrwsr-x 5 user-a shared 4096 Oct 7 22:10 folder-a
drwxrwsr-x 3 user-a shared 4096 Nov 10 22:10 folder-b
UID 和 GID 如下:
uid=1000(user-a) gid=1000(user-a) groups=1000(user-a),1003(shared)
uid=1002(user-b) gid=1002(user-b) groups=1002(user-b),1003(shared)
相关的 /etc/group
看起来像这样:
shared:x:1003:user-a,user-b
当su
访问两个用户时,可以在共享目录中按预期创建文件。
共享目录通过挂载绑定到 /shared/
附加到 Docker 容器。 Docker 容器作为 user-b
运行(使用 --user "1002:1002"
参数)
$ ps aux | grep user-b
user-b 1347 0.2 1.2 1579548 45740 ? Ssl 17:47 0:02 entrypoint.sh
id
从容器中打印以下内容,对我来说还不错的结果:
I have no name!@7a5d2cc27491:/$ id
uid=1002 gid=1002
同时 ls -la
完美地镜像了它的主机系统:
I have no name!@7a5d2cc27491:/shared ls -la
total 16
drwxrwsr-x 4 1000 1003 4096 Oct 7 20:21 .
drwxr-xr-x 1 root root 4096 Oct 8 07:58 ..
drwxrwsr-x 5 1000 1003 4096 Oct 7 20:10 folder-a
drwxrwsr-x 3 1000 1003 4096 Nov 10 20:10 folder-b
问题
在容器中,我无法向共享目录写入任何内容。对于 touch test
,我得到以下信息,即:
I have no name!@7a5d2cc27491:/shared$ touch test
touch: cannot touch 'test': Permission denied
我可以写入 直接 由 user-b
(用户和组)拥有并挂载到容器的目录...只是组成员似乎不知何故根本不被尊重
我已经研究过 user namespace remapping 之类的东西,但这些似乎是针对此处不适用的东西的解决方案。我想念什么?
您的容器用户有 gid=1002
,但不是组 shared
和 gid=1003
的成员。
除了 --user "1002:1002"
,您还需要 --group-add 1003
。
允许容器用户访问 gid=1003
.
id
应该显示:
I have no name!@7a5d2cc27491:/$ id
uid=1002 gid=1002 groups=1003