【问题标题】:Mapping of user Id's用户ID的映射
【发布时间】:2022-02-15 01:41:51
【问题描述】:

我正在以无根模式评估 podman,但遇到了用户 ID 映射问题。

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

cat /etc/subuid
myuser:100000:65536

在运行 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

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

谢谢 约尔格

【问题讨论】:

  • 在容器中创建一个作为 UID 2002 运行的文件通常会在主机上创建一个所有权 UID 102001 的文件,如果 /etc/subuid 包含 myuser:100000:65536。您是否可能以某种方式使用 --userns

标签: podman


【解决方案1】:

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

看起来您使用的容器 UID 是

102002-100000+1=2003

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

这个例子演示了这样一个计算(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
$

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

uid=2003
subuidStart=100000
subuidSize=65536

您可以尝试将这三个选项同时传递给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。

host UID intermediate UID container UID
normal host UID 0 $uid

--uidmap 0:1:$uid

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

host UID intermediate UID container 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。

host UID intermediate UID container 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 年 2 月 14 日更新

我在 Podman 文档中为此写了一个 troubleshooting tip

【讨论】:

  • 我用 --uidmap 逻辑创建了一个脚本。我收到了错误“错误:容器 ID 0 无法映射到主机 ID”,因此我添加了“--uidmap=0:1:1”作为附加参数。现在我收到Error: error creating container storage: error creating an ID-mapped copy of layer "1cfdca7e59023298ba1f7787a961bd90e2bcac6680d9591268d2d1c83c0c8ef7": exit status 1: error during chown: error mapping container ID pair idtools.IDPair{UID:0, GID:42} for "etc/gshadow" to host: Container ID 42 cannot be mapped to a host ID
  • 你知道是否可以为podman build 做同样的事情吗?我尝试用--userns-uid-map 替换--uidmap,但它似乎没有做任何事情。
  • 我从未尝试过 podman build--userns-uid-map,但我猜它与 --uidmappodman run 的作用相同。
猜你喜欢
  • 2021-06-18
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2013-09-02
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多