是的,您可以使用命令行选项重新映射 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。