配置rootless docker后执行docker images无法显示原有镜像如何解决
问题原因
你遇到的镜像不互通问题是rootless Docker的设计特性导致的:
- 常规通过root运行的Docker,镜像、容器数据默认存储在
/var/lib/docker路径下,只有root权限才能读写 - rootless模式的Docker是完全独立的服务实例,数据存储在普通用户的家目录下(默认是
~/.local/share/docker),和系统级Docker的资源完全隔离
普通用户执行docker命令时默认对接的是rootless Docker实例,加sudo之后才会对接系统级的Docker实例,二者资源完全隔离,因此会出现无镜像返回的情况。
解决方案
根据你的使用需求可以选择以下两种方案:
方案1:放弃rootless模式,给普通用户开放系统级Docker操作权限
如果你不需要rootless的安全隔离特性,该方案操作最便捷:
- 停止并卸载当前用户的rootless Docker服务:
systemctl --user stop docker systemctl --user disable docker dockerd-rootless-setuptool.sh uninstall
- 将当前用户加入
docker用户组,即可无需sudo操作系统级Docker:
sudo usermod -aG docker $USER
- 执行
newgrp docker刷新用户组权限,或退出当前终端重新登录,之后执行docker images即可看到所有原有镜像。
方案2:保留rootless模式,迁移原有镜像到rootless实例
如果你需要保留rootless的安全特性,可将系统级Docker的镜像导出后导入到rootless实例:
- 导出单个镜像示例(以
nginx:alpine为例):
sudo docker save nginx:alpine -o nginx-alpine.tar
- 批量导出所有系统级镜像可执行以下命令:
sudo docker images | awk 'NR>1 && $1!="<none>" {print $1":"$2}' | while read img; do sudo docker save $img -o $(echo $img | tr /: _).tar done
- 修改镜像包权限并批量导入到rootless Docker:
sudo chown $USER:$USER *.tar for tar in *.tar; do docker load -i $tar rm -f $tar done
- 导入完成后执行
docker images即可看到所有迁移的镜像,无需sudo即可正常运行。
内容的提问来源于stack exchange,提问作者norivotset
相关产品推荐
相关产品推荐

