Nexus推送Docker镜像报blob unknown to registry错误求解决方案
问题根因
- Nexus 不同 Docker 类型仓库的 Blob 存储默认逻辑隔离,docker-group 仅作为查询聚合入口,不会同步不同成员仓库的 Blob 数据
- 当前 Nginx 配置错误将
HEAD请求归类为写请求路由到 docker-hosted:Docker 推送前会发送 HEAD 请求校验 Blob 是否存在,docker-hosted 中没有 docker-proxy 缓存的基础镜像层就会返回不存在,但构建出的镜像 Manifest 里引用了这些层的哈希,最终提交 Manifest 时 Nexus 校验不通过报错。
可行解决方案
方案1(最优,无感知适配现有使用习惯)
- 第一步:调整 Nginx 路由规则,移除 Blob 路径写请求匹配规则中的 HEAD 方法
将原有配置:
修改为:if ($request_method ~* (POST|PUT|DELETE|PATCH|HEAD) ) {
HEAD 属于读请求,应该路由到 docker-group,这样 Docker 客户端查询 Blob 是否存在时,能从 group 中查询到 proxy 已缓存的层,不会出现 Manifest 校验失败的问题。if ($request_method ~* (POST|PUT|DELETE|PATCH) ) { - 第二步:开启 docker-hosted 仓库的 Foreign Layer Caching 功能
进入 Nexus 管理后台 → 打开 docker-hosted 仓库的配置页 → 勾选Foreign Layer Caching选项保存即可。开启后 docker-hosted 会自动复用 docker-proxy 中已缓存的公共镜像层,无需重复存储。
方案2(不修改现有通用路由规则)
给 docker-hosted 仓库单独分配独立的域名或端口,构建镜像后直接推送到 docker-hosted 的独立地址,同时开启方案 1 中的 Foreign Layer Caching 功能,同样可以自动复用 proxy 缓存的层,无需手动上传基础镜像。
方案3(临时应急,无需修改服务端配置)
手动将用到的公共基础镜像同步到 docker-hosted 仓库:
- 本地拉取基础镜像:
docker pull mynexusrepo.com/python:3.7.1 - 重打标签(如果 docker-hosted 有单独路径则替换为对应路径):
docker tag mynexusrepo.com/python:3.7.1 mynexusrepo.com/library/python:3.7.1 - 推送标签到仓库:
docker push mynexusrepo.com/library/python:3.7.1
同步完成后再推送业务镜像即可正常完成,缺点是每个用到的公共基础镜像都需要手动同步,维护成本较高。
内容的提问来源于stack exchange,提问作者Nader
相关产品推荐
相关产品推荐

