Podman中执行chown提示操作不被允许是什么原因?
问题原因
- rootless Podman运行时会基于
/etc/subuid、/etc/subgid中给当前用户分配的子ID段创建独立的用户命名空间,宿主机上显示的100999、105429就是该命名空间内root用户(UID/GID 0)对应的宿主机偏移ID podman unshare操作是进入当前用户的独立命名空间,该空间内仅允许操作分配的子ID段内的ID,宿主机真实UID 1000(avnav)、GID 5430(dba)不在该段内,因此直接执行chown会报Operation not permitted- 在
podman unshare环境内尝试修改为宿主机偏移ID100999:105429报错,是因为该ID仅存在于宿主机命名空间,在Podman的独立命名空间内无对应映射,属于无效ID参数
解决方案
无需root权限的方案优先:
方案1:启动容器时直接配置ID映射(无需修改目录权限,无需root)
启动Postgres容器时添加ID映射参数,将容器内postgres默认的UID/GID(通常为999)直接映射到宿主机的1000:5430,示例启动命令:
podman run -d \ --name postgres \ --uidmap 999:0:1 \ --gidmap 999:0:1 \ --uidmap 0:1:998 \ --gidmap 0:1:998 \ -v /home/_volumes/pg_db1:/var/lib/postgresql/data \ postgres:latest
以上参数含义为:将容器内999号UID/GID映射到当前用户命名空间的0号(对应宿主机avnav/dba的权限范围),其余ID正常偏移映射,无需修改宿主机目录权限即可满足Postgres的权限检查要求。
方案2:调整命名空间映射(需root权限操作一次)
如果需要长期匹配宿主机UID/GID,可联系管理员修改subuid/subgid配置:
- 在
/etc/subuid中添加当前用户的1000UID映射:avnav:1000:1 - 在
/etc/subgid中添加当前用户的5430GID映射:avnav:5430:1 - 执行
podman system migrate重启Podman的用户命名空间 - 再执行
podman unshare chown -R 1000:5430 /home/_volumes/pg_db1即可正常执行
临时验证方案
如果仅需快速验证功能,可在启动容器时添加--user 1000:5430参数,同时给宿主机/home/_volumes/pg_db1目录设置700权限即可,注意该方案下容器内用户的其他权限可能受限。
内容的提问来源于stack exchange,提问作者avnav99
相关产品推荐
相关产品推荐

