windows - 有效 mcr.microsoft.com/windows/servercore:ltsc2019-amd64 容器映像上的 BLOB_UNKNOWN
问题描述
在过去的几天里,我一直在使用 docker 注册表 API 并编写一个小工具来缩小它与 Microsoft 容器注册表 (mcr.microsoft.com) 的交互范围。我的最终目标是能够从 MCR 下载图像,而无需直接依赖 docker pull 或任何 docker 工具。
通读 Docker Registry API的文档,特别是关于如何拉层的部分,它指出 URL 构建为/v2/<name>/blobs/<digest>
. 然后,它提到客户端应如何准备从此类 URL 获取重定向响应。
我一直在尝试拉图像mcr.microsoft.com/windows/servercore:ltsc2019-amd64
,但我似乎无法成功实现这一目标。
从码头工人,这似乎工作正常:
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
返回的错误似乎是“未找到”而不是“重定向”。docker pull 如何找出从哪里下载图层的正确链接?
我尝试通读 docker 分发代码库,但似乎无法拼凑出这个谜题。在https://github.com/docker/distribution/blob/master/registry/storage/paths.go中,提到了 blob 的存储,我相信这是我构建层下载路径的地方。但是,我不完全理解它是如何找出真正的路径的,因为它只是尝试其中的一些,直到一个有效。
这里可能有什么问题?难道我做错了什么?我错过了什么吗?
解决方案
如果您检查 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"
]
}
推荐阅读
- python - Python pandas:数据框中的优雅划分
- tensorflow - 是否需要调用 Dataset.repeat()?
- python - ManyRelatedManager' 对象没有属性 'get_object_queryset'
- android - 如何在 Android 中创建笑脸可绘制 XML?
- python - BS4 从
标签获取信息 - django - 保持 Redis 数据在 Docker 容器中的 docker-compose down 和 up 之间保持活跃
- python-3.x - 如何为变量(或该功能)使用“b”前缀
- angular - 无法在我的 Angular 项目中安装 tailwind css
- reactjs - 清理 useEffect 挂钩中的功能问题
- reactjs - React useRef() 未显示 ref.current 的正确信息