Rootless Docker - 非根容器用户无法写入共享卷

Jua*_*nio 4 docker

在 Ubuntu 21.10 上,我按照https://docs.docker.com/engine/security/rootless/上的说明安装了 rootless Docker

我的/etc/subuid并且/etc/subgid似乎配置正确:

$ grep ^$(whoami): /etc/subuid
jtreminio:100000:65536

$ grep ^$(whoami): /etc/subgid
jtreminio:100000:65536
Run Code Online (Sandbox Code Playgroud)

根据我对命名空间映射的(诚然浅薄的)理解,我希望无根容器将其内部 root 用户映射0:0到我的主机的 user 1000:1000。情况似乎是这样:

$ docker container run --rm -it -v $PWD:/app -w /app bash touch foobar
$ ls -lah foobar
-rw-r--r-- 1 jtreminio jtreminio 0 Feb 11 16:50 foobar

Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在容器内使用任何其他用户 ID 时,我会失去所有写入权限:

$ docker container run --rm -it -v $PWD:/app -w /app -u 1000:1000 bash touch barfoo
touch: barfoo: Permission denied
Run Code Online (Sandbox Code Playgroud)

如果我创建一个设置了权限的目录,777这似乎有效:

$ mkdir barfoo && chmod 777 barfoo
$ docker container run --rm -it -v $PWD:/app -w /app -u 1000:1000 bash touch barfoo/foobar

$ ls -lah barfoo/
total 8.0K
drwxrwxrwx 2 jtreminio jtreminio 4.0K Feb 11 16:51 .
drwxr-xr-x 5 jtreminio jtreminio 4.0K Feb 11 16:51 ..
-rw-r--r-- 1    100999    100999    0 Feb 11 16:51 foobar
Run Code Online (Sandbox Code Playgroud)

我的困惑是我的内容/etc/subuid应该/etc/subgid抓住这个?我是否完全误解了用户命名空间的工作原理?

BMi*_*tch 5

跨绑定挂载的文件上没有 uid/gid 的文件系统映射。因此容器中的 uid 将与挂载主机端的 uid 相同。用户命名空间会移动容器中的这些 uid,因此:

$ grep ^$(whoami): /etc/subuid
jtreminio:100000:65536

$ grep ^$(whoami): /etc/subgid
jtreminio:100000:65536
Run Code Online (Sandbox Code Playgroud)

意味着将容器 uid 0-65536 映射到主机 uid 100000-165536(对于 gids 也是如此),因此这些是您将从容器中创建的文件中看到的主机中的 uid。