3

这个问题看起来很简单。

如果在此过程中推送被中断(^C?)但远程存储库已经有图像(相同的名称/标签),会发生什么?成功上传的图层会覆盖现有的图像,可能会损坏它吗?同样,在本地也可能发生同样的事情。

有人已经以这种方式进行调查了吗?

4

1 回答 1

3

现有图层不会被覆盖。

这就是 docker push/pull 根据v2 API的工作方式:

Docker 镜像由一个单独的清单文件和各个层组成。这些层以 blob 的形式存储在由它们的摘要键入的注册表中。清单文件将包含拉取、安装、验证和运行映像所需的所有详细信息。它还包含组成图像的层列表。

推送图片

推送图片时,客户端会先推送图层,然后上传签名的清单。因此,如果在上传清单之前推送中断,注册表将有一些未引用的 blob。当垃圾收集被触发时,这些 blob 将被删除。

上传图层时,客户端会询问注册表是否已经拥有该图层。如果注册中心已经有该层,则跳过特定层的上传。如果registry没有layer,client会请求上传,registry返回一个URL,client可以用来上传layer。层可以以块的形式上传,也可以作为整体的单个块上传。上传所有块后,客户端必须将层的摘要发送到注册表,如果上传内容的摘要匹配,注册表将验证并返回成功消息。只有在验证摘要后,才认为上传完成。

推送所有层后,客户端会上传图像清单文件。Registry 检查它是否具有清单中的所有层引用,并返回适当的错误,例如BLOB_UNKNOWN如果没有。

拉取图像

拉取图像的工作方式类似,但顺序相反。拉取镜像时,客户端将首先请求镜像清单,然后下载它没有的层。只有在验证了摘要后,下载才完成。

于 2020-01-22T12:30:15.023 回答