我正在无根模式下评估 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
Podman 4.3.0引入了可以赋予 的选项uid和gid--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。
将容器中的UID $uid映射到主机上的普通 UID。
| 主机UID | 中间UID | 容器UID |
|---|---|---|
| 普通主机 UID | 0 | $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 |
将容器中$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 。
我在 Podman 文档中写了有关此问题的故障排除提示。
| 归档时间: |
|
| 查看次数: |
22293 次 |
| 最近记录: |