Nexus3 docker镜像推送成功后blobs缺失导致离线环境无法拉取问题
问题产生原因
- 核心原因:Windows系统基础镜像(包含nanoserver、servercore等)的基础层属于不可分发层(nondistributable/foreign layer),Docker客户端默认不会将这类层推送到私有仓库,仅会在manifest中写入层的哈希和官方源地址引用。你在Nexus中看到的manifest是推送成功了,但真实的层文件根本没有上传到Nexus的blob存储中,无外网环境下Nexus无法从微软官方源拉取对应层,就会导致拉取镜像超时。
- 其他可能原因:
- 推送过程中网络中断,部分层上传失败,但manifest已提交成功,Nexus仅生成了镜像元数据没有存储对应层
- Nexus的blob存储目录权限不足,层文件写入磁盘失败
- 误将仓库创建为proxy类型,且未启用本地存储foreign层的配置,层被缓存清理机制删除
排查步骤
- 确认层属性:在推送镜像的Windows设备执行命令
docker inspect mcr.microsoft.com/windows/nanoserver:1809-amd64,查找哈希值为sha256:bc8517709e9cfff223cb034ff5be8fcbfa5409de286cdac9ae1b8878ebea6b84的层,若该层存在urls字段指向微软官方地址,即可确认是不可分发的foreign层。 - 验证blob存储路径:Nexus的blob存储默认按哈希值前两位拆分子目录存储,该层的存储路径应为
${Nexus数据目录}/blobs/${你的blob存储名}/sha256/bc/sha256:bc8517709e9cfff223cb034ff5be8fcbfa5409de286cdac9ae1b8878ebea6b84,不要直接在根目录搜索文件。 - 查看Nexus日志:进入Nexus管理后台,打开「支持-日志-日志查看器」,搜索对应层的哈希值,查看是否有找不到文件、尝试访问外网源失败的报错。
- 确认仓库类型:检查Docker仓库配置,确认是否为你需要的host类型,避免误创建为proxy类型。
解决方案
针对foreign层的通用解决方法
- 单次推送临时生效:推送时添加强制上传不可分发层的参数,命令如下:
docker push --allow-nondistributable-artifacts 192.168.10.10:5000/mcr.microsoft.com/windows/nanoserver:1809-amd64 - 永久生效配置:修改推送镜像的Windows设备上的Docker daemon配置文件
daemon.json,添加以下配置:
{ "allow-nondistributable-artifacts": ["192.168.10.10:5000"] }
重启Docker服务后,所有推送到该私有仓库的镜像都会自动上传foreign层,无需额外加参数。
其他异常场景的修复
- 先删除Nexus仓库中已存在的nanoserver镜像的对应标签和manifest,清理无效元数据。
- 检查Nexus运行用户对blob存储目录的读写权限,确保文件可以正常写入。
- 若为proxy类型仓库,进入仓库配置页面关闭「Proxy foreign layers」选项,避免Nexus尝试从外网拉取foreign层。
内容的提问来源于stack exchange,提问作者enrinku
相关产品推荐
相关产品推荐

