macOS Ventura下Rootless模式Podman挂载卷权限拒绝问题求助
在macOS Ventura 13.5系统下使用Podman 4.6.1(Rootless模式)替代Docker,执行以下命令启动容器处理本地文件:
podman run --rm --name foo -v "$PWD:/code" $DOCKER_IMAGE
容器内脚本编辑本地文件时返回Permission Denied错误,该脚本仅用于替换特定信息,错误信息如下:
sed: couldn't open temporary file ./sed66yRrG: Permission denied
容器内执行id命令的结果:
➜ path id uid=1001(image-user) gid=1001(image-user) groups=1001(image-user)
容器内查看挂载文件的所有者信息:
➜ path ls -lhtra -rw-r--r--. 1 root nobody 2.0K Aug 21 14:47 properties.ini
本地对应文件的所有者信息:
❯ ls -lhtra -rw-r--r--@ 1 myuser mygroup 2.0K Aug 21 11:47 properties.ini
尝试添加--userns=keep-id参数启动容器:
podman run --rm --name foo --userns=keep-id -v "$PWD:/code" $DOCKER_IMAGE
此时容器内文件信息:
➜ path ls -lhtra -rw-r--r--. 1 core nobody 2.0K Aug 21 14:47 properties.ini
但仍出现权限拒绝错误:
sed: couldn't open temporary file ./sed77hAfO: Permission denied
相同容器使用Docker运行时一切正常,容器内文件所有者为image-user且可写。
1. 直接指定容器运行用户的UID/GID(快速解决)
macOS Rootless Podman的用户映射逻辑和Docker不同,直接让容器内运行用户的UID/GID和本地文件所有者一致:
podman run --rm --name foo -u $(id -u):$(id -g) -v "$PWD:/code" $DOCKER_IMAGE
这样容器内用户拥有和本地myuser完全相同的权限,既能读写目标文件,也能正常创建sed所需的临时文件。
2. 将容器内用户加入nobody组
如果不想手动指定UID/GID,可在启动容器时把自动映射的core用户加入nobody组(挂载文件的组为nobody):
podman run --rm --name foo --userns=keep-id -v "$PWD:/code" $DOCKER_IMAGE sh -c "usermod -aG nobody core && exec your-script.sh"
替换your-script.sh为实际要运行的脚本路径,这样core用户就拥有了读写nobody组权限文件的能力。
3. 配置Podman默认用户映射(永久生效)
编辑~/.config/containers/containers.conf文件,添加以下配置:
[containers] userns="keep-id"
同时检查~/.config/subuid和~/.config/subgid文件,确保本地用户的UID/GID有足够的映射范围(若文件不存在,可运行podman system migrate生成)。最后重启Podman机器:
podman machine stop && podman machine start
之后默认启动容器会自动保持本地用户ID映射,再配合容器内用户组调整即可彻底解决权限问题。
内容的提问来源于stack exchange,提问作者Giuliani Sanches

