You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令的存储完全打通:

  1. 开启当前用户的podman socket服务,设置登录自动启动:
systemctl enable --now --user podman.socket
  1. 配置环境变量指定Docker兼容的默认socket路径,写入shell配置文件永久生效,避免依赖docker的工具找不到socket:
echo 'export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock' >> ~/.bashrc
source ~/.bashrc
  1. 验证效果,执行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访问统一的镜像、容器存储,可以直接使用系统级服务:

  1. 开启系统级podman socket服务,设置开机自启:
sudo systemctl enable --now podman.socket
  1. 注意后续所有镜像拉取、容器启动操作都需要加sudo执行,否则镜像还是会写入普通用户的独立存储,系统服务无法读取:
sudo docker pull docker.io/redhat/ubi9:latest
  1. 此时再调用/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:01:41