我正在编写一个 docker 注册表 API 包装器来从一个私有注册表中提取图像并将它们推送到另一个。
首先,根据文档,我需要为image:tag
. 在 Puling An Image之后,我已经成功下载了特定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,它使用 aPUT
并且与 Completed Upload 部分中显示的请求相同。那么通过整体上传,我是否也同时完成了上传?
问题
当我完成上述所有步骤时,我
BLOB_UNKNOWN
在上传摘要时收到错误消息,例如{ "errors:" [{ "code": "BLOB_UNKNOWN", "message": "blob unknown to registry", "detail": { "digest": } }, ... ] }
根据文档,推送清单时会产生此错误,并且清单中的其中一个层是未知的:
如果注册表未知一个或多个层,则返回 BLOB_UNKNOWN 错误。错误响应的详细信息字段将包含一个摘要字段,用于标识丢失的 blob。每个未知 blob 都会返回一个错误。响应格式如下:
让我感到困惑的是
- 我推送的是摘要(又名层)而不是清单,那么为什么会返回此错误?
- 我希望 blob 是未知的,因为我正在将新图像推送到注册表中
现在我将使用 docker 客户端,但我还没有在网上找到任何包装器示例来了解它是如何实现的。大概我错过了一些逻辑或误解了文档,但我不确定我哪里出错了?