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

Nexus推送Docker镜像报blob unknown to registry错误求解决方案

问题根因

  1. Nexus 不同 Docker 类型仓库的 Blob 存储默认逻辑隔离,docker-group 仅作为查询聚合入口,不会同步不同成员仓库的 Blob 数据
  2. 当前 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) ) {
    
    修改为:
    if ($request_method ~* (POST|PUT|DELETE|PATCH) ) {
    
    HEAD 属于读请求,应该路由到 docker-group,这样 Docker 客户端查询 Blob 是否存在时,能从 group 中查询到 proxy 已缓存的层,不会出现 Manifest 校验失败的问题。
  • 第二步:开启 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 仓库:

  1. 本地拉取基础镜像:docker pull mynexusrepo.com/python:3.7.1
  2. 重打标签(如果 docker-hosted 有单独路径则替换为对应路径):docker tag mynexusrepo.com/python:3.7.1 mynexusrepo.com/library/python:3.7.1
  3. 推送标签到仓库:docker push mynexusrepo.com/library/python:3.7.1
    同步完成后再推送业务镜像即可正常完成,缺点是每个用到的公共基础镜像都需要手动同步,维护成本较高。

内容的提问来源于stack exchange,提问作者Nader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:06:05