无根Docker主机文件权限

dwbf0jvd  于 5个月前  发布在  Docker
关注(0)|答案(1)|浏览(53)

我在Ubuntu 22.04上运行Docker version 24.0.7, build afdd53b rootless。我挂载到容器读写的主机文件夹显示为有效的只读。
在主机上:

$ cat /etc/group
...
docker:x:999:gpeterso,mjl
mjl:x:3251:gpeterso

$ cat /etc/subuid
gpeterso:100000:65536
mjl:200000:65536

$ cat /etc/subgid
gpeterso:100000:65536
mjl:200000:65536

$ ls -al /home/gpeterso/mjl-dev/web/logs/
total 8
drwxrwxr-x 2 mjl mjl 4096 Dec 13 11:06 .
drwxrwxr-x 8 mjl mjl 4096 Sep 29 12:59 ..

字符串
然后我启动docker容器并检查它:

$ docker inspect mjl-dev-web
[
    {
...
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
...
        "HostConfig": {
            "Binds": [
...
                "/home/gpeterso/mjl-dev/web/logs/:/usr/local/ROOT/logs/",
...
            ],
        "Mounts": [
...
            {
                "Type": "bind",
                "Source": "/home/gpeterso/mjl-dev/web/logs",
                "Destination": "/usr/local/ROOT/logs",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
...
        ],
        "Config": {
...
            "User": "mjl",
...
]


然后我连接到容器并尝试访问目录:

$ docker exec -it mjl-dev-web /bin/bash

5af614bba1c8:/usr/local/ROOT$ cd logs

5af614bba1c8:/usr/local/ROOT/logs$ ls -al
total 8
drwxrwxr-x    2 nobody   nobody        4096 Dec 13 11:06 .
drwxr-xr-x    1 root     root          4096 Dec 13 11:20 ..

5af614bba1c8:/usr/local/ROOT/logs$ echo 'hi' >test.txt
bash: test.txt: Permission denied

5af614bba1c8:/usr/local/ROOT$ whoami
mjl


Docker容器显示Map的文件夹RW(读和写)。所以我假设它一定是用户混淆?为什么我Map的驱动器显示为nobody或root而不是mjl?我尝试了sudo systemctl restart docker,但我现在要重新启动。

inb24sb2

inb24sb21#

这不是混淆,这是用户名称空间的工作方式。容器中的uid/gid会根据subbuid/subgid条目进行移位。因此容器中的uid/gid 0/0会Map到主机上的200000/200000。文件系统挂载上没有uid/gid的Map,因此如果uid 200000无法写入主机上的文件,容器中的uid 0也不能写入文件。
一种解决方法是为容器根用户定义一个subbuid/subgid条目,该条目Map回您的主机用户,例如,如果mjl的uid/gid为1001,则可以添加如下条目:

$ cat /etc/subuid
gpeterso:100000:65536
mjl:1001:1
mjl:200000:65535

$ cat /etc/subgid
gpeterso:100000:65536
mjl:1001:1
mjl:200000:65535

字符串
容器中的root将Map到主机上的1001/1001。
另一种选择是在主机上添加一个用户,该用户与主机Map的uid/gid匹配,并且是可以写入文件夹的组的成员。这可能还需要在容器的/etc/group文件中使用容器uid/gid完成,我不确定内核是否在绑定挂载的两个位置都强制执行它。在这种情况下,这将涉及为mljcroot添加一个用户到主机,uid/gid 200000/200000,是mlj组的成员。

相关问题