Docker配置Nexus镜像源后不指定registry拉取镜像报manifest unknown错误
问题根因
你将Nexus hosted类型Docker仓库配置为Docker镜像源后,执行无registry地址的拉取命令docker pull mongo:4.2.3时,Docker会自动在镜像名前补library/前缀,向Nexus请求/v2/library/mongo/manifests/4.2.3路径,而你提前上传到Nexus的镜像路径为/v2/mongo/manifests/4.2.3,路径不匹配就会返回manifest unknown错误,触发Docker fallback到官方docker.io拉取。
指定registry地址拉取时,Docker不会自动补library/前缀,直接请求你指定的路径,因此可以拉取成功,但镜像名会自带registry前缀不符合预期。
解决方案
方案一:修正Nexus内的镜像路径(推荐,适配离线环境)
操作步骤如下:
- 给需要上传到Nexus的官方镜像打标,增加
library/前缀,示例如下:
docker tag mongo:4.2.3 xxx.xxx.x.xxx:8083/library/mongo:4.2.3
- 推送打标后的镜像到Nexus仓库:
docker push xxx.xxx.x.xxx:8083/library/mongo:4.2.3
- 验证拉取:清理本地已有mongo镜像后执行
docker pull mongo:4.2.3,即可直接从Nexus拉取到不带registry前缀的镜像,符合使用要求。
方案二:劫持docker.io解析(完全离线环境适配)
如果你的环境完全断网,不需要访问官方Docker Hub,可以用该方案无需修改已上传的镜像路径:
- 修改所有Docker客户端的
/etc/hosts文件,添加如下内容:
xxx.xxx.x.xxx registry-1.docker.io
- 编辑
/etc/docker/daemon.json,将docker.io加入不安全仓库列表:
{ "insecure-registries": ["xxx.xxx.x.xxx:8083", "docker.io"], "registry-mirrors": ["http://xxx.xxx.x.xxx:8083"] }
- 重启Docker服务生效:
systemctl daemon-reload && systemctl restart docker
配置完成后,所有指向docker.io的拉取请求都会被转发到你的Nexus仓库,直接拉取mongo:4.2.3即可命中你已上传的镜像。
配置校验
修改完成后执行docker system info,确认如下配置项正确:
Insecure Registries包含你用到的仓库地址Registry Mirrors指向你的Nexus仓库地址
内容的提问来源于stack exchange,提问作者Gopi
相关产品推荐
相关产品推荐

