以非root用户身份运行容器,以使容器“ root”不会映射到正在运行的用户

时间:2019-10-08 19:43:43

标签: podman

问题:

如何使用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

从上面可以看到,容器根用户已映射到运行该容器的主机用户的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))映射到/etc/subuid中映射到我的用户的uid的作用。 / p>

技术细节:

使用.config/containers/storage.confvfs文件从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"

除此之外,它是使用official PPAs安装在Ubuntu 18.04上的标准podman版本1.5.1

0 个答案:

没有答案