在过去的几天中,我一直在使用docker Registry 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 Registry 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
返回的错误似乎是“未找到”而不是“重定向”。 docker如何从哪里下载层来确定正确的链接?
我尝试通读docker分发代码库,但似乎无法解决这个难题。在https://github.com/docker/distribution/blob/master/registry/storage/paths.go中,关于Blob的存储有一些提及,我认为这是从我的层构建下载路径的地方。但是,我不完全了解它是如何找到实际路径的,因为它只是尝试其中的一些直到有效。
这里可能有什么问题?难道我做错了什么?我想念什么吗?
答案 0 :(得分:0)
如果检查docker清单规范,它将显示有关外部层的信息: https://docs.docker.com/registry/spec/manifest-v2-2/
类型为application / vnd.docker.image.rootfs.foreign.diff.tar.gzip的层可能会从远程位置拉出,但绝对不应推送。
这主要适用于Windows基本层,这些层通常是从注册表外部单独托管的。当前对于MCR来说是相同的。如果查看图像的清单,则可以看到带有URL的图层。服务器返回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"
]
}