以下列表归类了以非root用户身份运行Podman时已知的缺陷与异常情况。尽管当前功能尚可正常使用,仍有若干待处理事项正在考虑中。这些拟议变更处于不同程度的设计与开发阶段。
非常欢迎贡献者为这项工作提供帮助。如果您决定承担其中一部分工作,请在GitHub上创建一个议题,并将其分配给自己。如果您发现无root权限的Podman存在其他意外行为,且认为有必要记录,请随时更新本文档。
Podman 无法创建绑定到小于1024 端口的容器
内核不允许没有 CAP_NET_BIND_SERVICE 权限的进程绑定到低端口。
您可以修改 net.ipv4.ip_unprivileged_port_start sysctl 参数来更改最低端口。例如,sysctl net.ipv4.ip_unprivileged_port_start=443 可使无特权 Podman 容器绑定到 443 及以上端口。
在服务器场景中,当用户拥有root账户访问权限(或允许二进制文件设置 setuid 权限作为可接受风险),但希望以非特权用户身份运行容器以增强安全性并限制预知端口数量时,可通过代理服务器、内核防火墙规则或重定向工具(如 redir)将特权端口的流量重定向至非特权端口(Podman 容器绑定在此端口)。
从 Podman 5.0 开始,pasta 成为默认的网络工具。由于 pasta 会复制主网卡的 IP 地址,容器对该 IP 的连接将无法建立。这意味着除非您拥有多个网卡,否则必须在 containers.conf 文件中或运行时显式传递 pasta 网络配置,才能实现容器间的连接。
若您此前曾配置端口转发(例如通过 -p 80:80),使其他容器能够访问,则可选择恢复使用 slirp4netns,或采用此处发布的解决方案(通过设置 pasta 选项使用 10.0.2.x IP 地址)。
“操作指南”类文档充其量也只是零零散散的。
如果用户未设置/etc/subuid和/etc/subgid,podman命令就容易失败。
这在使用基于网络的密码信息(如FreeIPA、Active Directory、LDAP)的机器上可能是个大问题。
我们正在努力为NSSWITCH在/etc/subuid和/etc/subgid文件上获取支持。
不支持cgroup V1
cgroup V1 不能安全地支持 cgroup 委派。
从Fedora 31开始,默认使用cgroup V2,它完全支持无root权限的cgroup管理。请注意,这要求无root权限容器中的--cgroup-manager使用systemd,新容器会默认采用这一设置。
一些系统单元配置选项在无root权限容器中无法工作
systemd无法应用多个选项,且失败会被静默忽略(例如CPUShares、MemoryLimit)。这在cgroup V2上应该能正常工作。
使用某些选项会导致服务启动失败(例如PrivateNetwork)。需要PrivateNetwork的systemd服务可以通过传递--cap-add SYS_ADMIN来使其正常工作,但应仔细评估其安全影响。在大多数情况下,更好的做法是创建一个override.conf扩展配置文件,并将PrivateNetwork设置为no。这也适用于由root运行的容器。
无法与CRI-O或其他有根用户共享容器镜像
难以使用额外的存储库来共享内容
在NFS或并行文件系统主目录(例如GPFS)上无法运行
NFS和并行文件系统在服务器端强制使用不同的UID创建文件,并且不理解用户命名空间。
当像YUM这样的容器根进程尝试创建一个属于不同UID的文件时,NFS服务器/GPFS会拒绝创建该文件。
无法在以noexec/nodev方式挂载的主目录上运行
用户可以设置存储,使其指向他们能够写入且未以noexec/nodev方式挂载的其他目录。
作为非特权用户使用原生 overlayfs 的支持仅适用于版本 ≥3.1的 Podman 和版本 ≥5.12 的 Linux 内核,否则可能会使用速度较慢的 fuse-overlayfs。
一些Linux发行版(例如Ubuntu)通过修改正常的Linux内核行为,已经支持了更旧版本的Podman和Linux内核。
唯一其他受支持的驱动程序是VFS。
无法开箱即用地使用ping命令。
可以通过在主机上设置sysctl来修复
需要新的shadow-utils(在较旧的(RHEL7/Centos7发行版)中未找到,应在RHEL7.7版本中修复)
有几个命令无法工作
mount/unmount (在 fuse-overlay 上)
只有当你使用 podman unshare 进入挂载命名空间时,它才会工作
podman stats (支持 cgroup V2 时可工作)
检查点和恢复(CRIU需要root权限)
暂停和取消暂停(支持cgroup V2时可工作)
较高UID的问题可能导致构建失败
如果构建尝试使用未映射到容器用户命名空间映射中的UID,那么构建将无法将该UID放入镜像中。
即使在运行时使用--privileged选项,在容器内创建设备节点也会失败。
内核不允许非root用户进程(没有CAP_MKNOD权限的进程)创建设备节点。如果容器需要创建设备节点,就必须以root身份运行。
在无 root 权限容器中使用 --net=host 时,后续对该容器执行 podman exec 操作将无法加入主机网络命名空间,因为该命名空间归 root 所有。