用户 ID 的映射

Jör*_*ang 13 podman

我正在无根模式下评估 podman,并面临用户 ID 映射问题。

我使用 ID 为 1000 的“myuser”运行 podman。

cat /etc/subuid
myuser:100000:65536
Run Code Online (Sandbox Code Playgroud)

运行 pod 时,pod 用户是 root,从主机角度来看,已安装卷上创建的文件属于“myuser”,我可以访问它们,所以一切都很好。

运行 pod 时,pod 用户不是 root(例如 UID 2002),从主机角度来看,已安装卷上创建的文件属于 UID“102002”,这会导致我无法访问主机上的该文件

正如预期的那样,podman unshare 如下所示

podman unshare cat /proc/self/uid_map
0       1000          1
1     100000      65536
Run Code Online (Sandbox Code Playgroud)

我是否有机会通过正确配置 podman 运行或配置文件来访问这些文件?

谢谢约尔格

Eri*_*und 18

2022 年 11 月 4 日更新

Podman 4.3.0引入了可以赋予 的选项uidgid--userns keep-id

现在可以改为给出本答案中 使用--uidmap--gidmap描述的 UID 和 GID 映射--userns keep-id:uid=$uid,gid=$gid。唯一的区别是新语法更短,从而节省了键盘输入的时间。

另请参阅故障排除提示:

Podman 运行失败,并显示“错误:无法识别的命名空间模式 keep-id:uid=1000,gid=1000 已通过”


是的,您可以使用命令行选项 --uidmap重新映射 UID 。

看起来您正在使用的容器 UID 是

102002-100000+1=2003
Run Code Online (Sandbox Code Playgroud)

数字 1 在那里是因为主机上的普通 UID 默认映射到容器中的根。

此示例演示了这样的计算(1002002-100000+1=2003)

$ id  -un
testuser
$ grep testuser /etc/subuid
testuser:100000:65536
$ grep testuser /etc/subgid
testuser:100000:65536
$ mkdir dir1
$ chmod 777 dir1
$ podman run --rm -v ./dir1:/dir1:Z \
             --user 2003:2003 \
             docker.io/library/ubuntu touch /dir1/a
$ ls -l dir1/a
-rw-r--r--. 1 102002 102002 0 Jan 19 19:35 dir1/a
$
Run Code Online (Sandbox Code Playgroud)

让我们定义一些变量,以便其他人可以更方便地重用这个 Stackoverflow 答案。

uid=2003
subuidStart=100000
subuidSize=65536
Run Code Online (Sandbox Code Playgroud)

您可以尝试同时传递这三个选项podman run

  • --uidmap $uid:0:1
  • --uidmap 0:1:$uid
  • --uidmap $(($uid+1)):$(($uid+1)):$(($subuidSize-$uid))

注意$(( expression ))是 Bash 语法,因此您需要使用 bash shell。

--uidmap $uid:0:1

将容器中的UID $uid映射到主机上的普通 UID。

主机UID 中间UID 容器UID
普通主机 UID 0 $uid

--uidmap 0:1:$uid

将容器中0$uid - 1之间的 UID 映射 到 subuid 的下部(从属 UID)(从$subuidStart$subuidStart+$uid-1)。

主机UID 中间UID 容器UID
$subuidStart 1 0
$subuidStart + 1 2 1
... ... ...
$subuidStart + $uid - 1 $uid $uid - 1

--uidmap $(($uid+1)):$(($uid+1)):$(($subuidSize-$uid))

将容器中$uid+1$subuidSize之间的 UID 映射到其余的 subuid。

主机UID 中间UID 容器UID
$subuidStart + $uid $uid + 1 $uid + 1
$subuidStart + $uid + 1 $uid + 2 $uid + 2
... ... ...
$subuidStart + $subuidSize - 1 $subuidSize $subuidSize

请注意,用户无法修改主机 UID 和中间 UID 之间的映射。普通主机 UID 始终映射到中间 UID 0

请注意,一般情况下可能有多个 subuid 范围。

GID有一个类似的命令行选项--gidmap 。

更新2022-02-14

我在 Podman 文档中写了有关此问题的故障排除提示。