问题:
如何使用 podman 以非 root 身份运行容器,以便容器内的 root 用户不会映射到运行容器的主机用户?
细节
在 podman 中,当以非 root 身份运行容器时,容器 root uid (0) 映射到主机 uid,而其他所有 uid 都根据/etc/subuid
文件进行映射。例如:
$ grep $USER /etc/subuid
myuser:231072:65536
$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser)
$ podman run --rm -ti -v /tmp:/tmp --entrypoint='["/sbin/my_init", "--"]' \
> docker.io/phusion/baseimage:0.11 bash
[...]
*** Running bash...
root@e9f79e3fe659:/# touch /tmp/as_root
root@e9f79e3fe659:/# adduser --gecos '' --disabled-password inneruser
Adding user `inneruser' ...
Adding new group `inneruser' (1000) ...
Adding new user `inneruser' (1000) with group `inneruser' ...
Creating home directory `/home/inneruser' ...
Copying files from `/etc/skel' ...
root@e9f79e3fe659:/# setuser inneruser touch /tmp/as_inneruser
root@e9f79e3fe659:/# ls -n /tmp/as_root /tmp/as_inneruser
-rw-r--r-- 1 1000 1000 0 Oct 8 19:20 /tmp/as_inneruser
-rw-r--r-- 1 0 0 0 Oct 8 19:05 /tmp/as_root
root@e9f79e3fe659:/# exit
exit
*** bash exited with status 0.
[...]
*** Killing all processes...
$ ls -n /tmp/as_root /tmp/as_inneruser
-rw-r--r-- 1 232071 232071 0 out 8 16:20 /tmp/as_inneruser
-rw-r--r-- 1 1000 1000 0 out 8 16:05 /tmp/as_root
如上所示,容器 root 用户被映射到运行容器的主机用户的 uid(即 1000),因此由 root 创建的文件具有myuser
的 uid(即 1000)。
而容器内的非root用户是根据subuid
运行用户的映射来映射的,即:inneruser
容器内的用户,uid 1000,映射到宿主机的uid 232071(231072 + 1000)。
重复问题:
如何使用 podman 以非 root 身份运行容器,以便容器内的 root 用户不会映射到运行容器的主机用户?
我尝试传递--subuidname=myuser
给 podman,即:
$ podman run --subuidname=myuser --rm -ti -v /tmp:/tmp --entrypoint='["/sbin/my_init", "--"]' \
> docker.io/phusion/baseimage:0.11 bash
但我收到这条消息:
Error: error creating libpod runtime: there might not be enough IDs available in the namespace
(requested 231072:231072 for /home/myuser/.local/share/containers/storage/overlay/l):
chown /home/myuser/.local/share/containers/storage/overlay/l: invalid argument
我原以为传递分配给我的用户的确切命名空间会产生将所有容器 uid 映射到的效果,包括容器根 (0) 到映射到我的用户 in /etc/subuid
.
技术细节:
使用 将.config/containers/storage.conf
文件从vfs
驱动程序更改为驱动overlay
程序fuse-overlayfs
,即:
[storage]
driver = "overlay"
runroot = "/run/user/1000"
graphroot = "/home/myuser/.local/share/containers/storage"
[storage.options]
size = ""
remap-uids = ""
remap-gids = ""
ignore_chown_errors = ""
remap-user = ""
remap-group = ""
ostree_repo = ""
skip_mount_home = ""
mount_program = "/home/myuser/bin/fuse-overlayfs"
除此之外,它是使用官方 PPA1.5.1
安装在 Ubuntu 18.04 上的标准 podman 版本。