BLOB_UNKNOWN 有效 mcr.microsoft.com/windows/servercore:ltsc2019-amd64 容器镜像

BLOB_UNKNOWN on valid mcr.microsoft.com/windows/servercore:ltsc2019-amd64 container image

在过去的几天里,我一直在研究 docker 注册表 API 并编写了一个小工具来缩小它与 Microsoft 容器注册表的交互范围 (mcr.microsoft.com).我的最终目标是能够从 MCR 下载图像,而无需直接依赖 docker pull 或任何 docker 工具。

通读 documentation of the Docker Registry API,特别是关于如何拉图层的部分,它指出 URL 构建为 /v2/<name>/blobs/<digest>。然后,它提到客户端应该如何准备从这样的 URL.

获得重定向响应

我一直在尝试拉取镜像mcr.microsoft.com/windows/servercore:ltsc2019-amd64,但似乎无法成功。

来自 docker,这似乎工作正常:

PS C:\> docker pull mcr.microsoft.com/windows/servercore:ltsc2019-amd64                                                                        ltsc2019-amd64: Pulling from windows/servercore
65014b3c3121: Pull complete                                                                                                                    b16cfeeaf4b3: Pull complete                                                                                                                    Digest: sha256:481b0eb967cee61ce09dd81ece5effc5c327c170d11cc73c307c88a80017c9eb
Status: Downloaded newer image for mcr.microsoft.com/windows/servercore:ltsc2019-amd64
mcr.microsoft.com/windows/servercore:ltsc2019-amd64

但是,我无法直接使用 docker 注册表 API 获取此图像的各个 blob:

PS C:\> (Invoke-RestMethod -Method Get -Uri "https://mcr.microsoft.com/v2/windows/servercore/manifests/ltsc2019-amd64").fsLayers                                                                                                                
blobSum
-------
sha256:b16cfeeaf4b37af9fc146f7043ceb629c1bc50ace967227817e50e47f4a71529
sha256:65014b3c312172f10bd6701a063f9b5aaf9a916c2d2cb843d406a6f77ded3f8d


PS C:\> Invoke-RestMethod -Method Get -Uri "https://mcr.microsoft.com/v2/windows/servercore/blobs/sha256:b16cfeeaf4b37af9fc146f7043ceb629c1bc50ace967227817e50e47f4a71529"                                                                      Invoke-RestMethod : {"errors":[{"code":"BLOB_UNKNOWN","message":"blob unknown to
registry","detail":"sha256:b16cfeeaf4b37af9fc146f7043ceb629c1bc50ace967227817e50e47f4a71529"}]}
At line:1 char:1
+ Invoke-RestMethod -Method Get -Uri "https://mcr.microsoft.com/v2/wind ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebExc
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
PS C:\> Invoke-RestMethod -Method Get -Uri "https://mcr.microsoft.com/v2/windows/servercore/blobs/sha256:65014b3c312172f10bd6701a063f9b5aaf9a916c2d2cb843d406a6f77ded3f8d"                                                                      Invoke-RestMethod : {"errors":[{"code":"BLOB_UNKNOWN","message":"blob unknown to
registry","detail":"sha256:65014b3c312172f10bd6701a063f9b5aaf9a916c2d2cb843d406a6f77ded3f8d"}]}
At line:1 char:1
+ Invoke-RestMethod -Method Get -Uri "https://mcr.microsoft.com/v2/wind ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebExc
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

返回的错误似乎是 "not found" 而不是 "redirect"。 docker pull 如何找出正确的 link 从哪里下载图层?

我试着通读了 docker 分发代码库,但我似乎无法拼凑出这个谜题。 https://github.com/docker/distribution/blob/master/registry/storage/paths.go 中提到了 blob 的存储,我相信这是从构建 I 层下载路径的地方开始的。但是,我不完全理解它是如何计算出真实路径的,因为它只是尝试了其中的几个,直到一个有效。

这里可能出了什么问题?难道我做错了什么?我错过了什么吗?

如果您查看 docker 清单规范,它会说明外部层: https://docs.docker.com/registry/spec/manifest-v2-2/

application/vnd.docker.image.rootfs.foreign.diff.tar.gzip 类型的层可以从远程位置拉出,但绝不能推送。

这主要适用于通常与注册表外部分开托管的 Windows 基础层。这目前与 MCR 相同。如果您查看图像的清单,您可以看到带有 URL 的图层。当服务器 returns 404 时,您应该按照清单中的 URL 下载图层 blob

   "layers": [
      {
         "mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip",
         "size": 1534685324,
         "digest": "sha256:65014b3c312172f10bd6701a063f9b5aaf9a916c2d2cb843d406a6f77ded3f8d",
         "urls": [
            "https://go.microsoft.com/fwlink/?linkid=2041275"
         ]
      }