我正在编写一个Docker注册表API包装器,以从一个私有注册表中提取图像并将其推送到另一个注册表。
根据文档,首先需要提取图像的清单和层。按照提取镜像的步骤,我已成功下载了特定image:tag
的所有层和清单。
按照推送镜像的步骤,我已经执行了以下步骤:
POST /v2/<name>/blobs/uploads/
(获取UUID即Location
头)HEAD /v2/<name>/blobs/<digest>
(检查它是否已存在于注册表中)PUT /v2/<name>/blobs/uploads/<uuid>?digest=<digest>
(Monolithic Upload
)
对我来说不清楚的是以下内容:
- 每个图层的
UUID
是否唯一,还是所有图层都重复使用(例如,我需要为每个图层运行新的POST并获取新的UUID
才能尝试上传它)。 - Completed Upload部分指出:
为了使上传被视为完成,客户端必须在上传终点提交一个带有摘要参数的PUT请求
但是,正如我所提到的,我正在使用Monolithic Upload,它使用PUT
,与完成上传部分显示的请求相同。那么,通过进行单块上传,我也同时完成了上传吗?
问题
当我按照上述所有步骤操作时,上传摘要时收到
BLOB_UNKNOWN
错误,例如:{ "errors:" [{ "code": "BLOB_UNKNOWN", "message": "blob unknown to registry", "detail": { "digest": } }, ... ] }
根据文档,当推送清单并且其中一个图层在清单中是未知的时,会产生此错误:
如果一个或多个层未知于注册表,则会返回BLOB_UNKNOWN错误。错误响应的详细信息字段将有一个摘要字段,用于标识缺失的blob。每个未知blob都会返回一个错误。响应格式如下:这让我困惑的是:
1. 我正在推送摘要(也就是一个层),而不是清单,为什么会返回此错误?
2. 我预期这个blob是未知的,因为我正在向注册表中推送新的镜像。
目前我将使用docker客户端,但我没有在网上找到任何包装器示例来查看如何完成此操作。假定我缺少一些逻辑或误解了文档,但我不确定我哪里错了?