RHEL9通过socket访问podman-docker返回空结果问题咨询
问题根因
这是Podman默认rootless运行模式的存储隔离机制导致的,和配置遗漏无关:
- 你在普通用户终端执行
docker命令(由podman-docker包提供的Docker命令兼容层)时,拉取的镜像、创建的容器全部存在当前普通用户的独立存储目录(默认路径~/.local/share/containers/storage/),和root用户的Podman存储完全隔离、互不可见。 - 你当前访问的
/var/run/docker.sock默认绑定的是root身份运行的系统级Podman服务,这个服务只能读取root用户名下的容器、镜像数据。你用普通用户拉的镜像根本不在它的存储范围内,所以调用镜像列表接口返回空数组。_ping接口仅检测服务运行状态,不读取存储数据,所以能正常返回OK,和你看到的现象完全吻合。
解决方法
根据实际使用需求二选一即可:
方案1:使用普通用户级Podman Socket(推荐,符合rootless安全设计)
不需要root权限,直接启动当前用户专属的Podman服务即可,和你平时本地执行docker命令的存储完全打通:
- 开启当前用户的podman socket服务,设置登录自动启动:
systemctl enable --now --user podman.socket
- 配置环境变量指定Docker兼容的默认socket路径,写入shell配置文件永久生效,避免依赖docker的工具找不到socket:
echo 'export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock' >> ~/.bashrc source ~/.bashrc
- 验证效果,执行curl调用即可正常返回你之前拉取的所有镜像:
curl --unix-socket /run/user/$UID/podman/podman.sock http://localhost/images/json | jq .
如果有工具硬编码读取/var/run/docker.sock路径,要么修改工具配置指向上述用户级socket路径,要么选择方案2。
方案2:使用系统级root权限Podman Socket
如果你需要所有用户通过同一个Socket访问统一的镜像、容器存储,可以直接使用系统级服务:
- 开启系统级podman socket服务,设置开机自启:
sudo systemctl enable --now podman.socket
- 注意后续所有镜像拉取、容器启动操作都需要加
sudo执行,否则镜像还是会写入普通用户的独立存储,系统服务无法读取:
sudo docker pull docker.io/redhat/ubi9:latest
- 此时再调用
/var/run/docker.sock接口就能正常返回root用户存储下的镜像、容器列表。
额外说明
- 若要关闭podman-docker的兼容提示
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.,执行sudo touch /etc/containers/nodocker即可。 - 不要为了图方便修改
/var/run/docker.sock的属主、权限给普通用户访问,会直接打破rootless容器的安全边界,生产环境严禁此类操作。
内容的提问来源于stack exchange,提问作者incubus
相关产品推荐
相关产品推荐

