Artifactory中Docker镜像外部层拉取失败(未授权)问题求助
问题
我们已向Artifactory推送了一个更新后的Docker镜像。此前镜像清单中的两个外部层(foreign layers)如下:
{ "mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip", "size": 1718332879, "digest": "sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f", "urls": [ "https://mcr.microsoft.com/v2/windows/servercore/blobs/sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f" ] }, { "mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip", "size": 997587446, "digest": "sha256:ba8181afd4264392fbbf8df14fb4cddc55fbe085ab000e986b789678bc2bb171", "urls": [ "https://mcr.microsoft.com/v2/windows/servercore/blobs/sha256:ba8181afd4264392fbbf8df14fb4cddc55fbe085ab000e986b789678bc2bb171" ] }
而新镜像清单中这两个外部层的内容变为:
{ "mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip", "size": 1718332879, "digest": "sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f", "urls": [ "https://docker.securethingz.com:443/artifactory/api/docker/stz-docker/v2/stz/ltsc2019/mingw64build/blobs/sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f" ] }, { "mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip", "size": 997587446, "digest": "sha256:ba8181afd4264392fbbf8df14fb4cddc55fbe085ab000e986b789678bc2bb171", "urls": [ "https://docker.securethingz.com:443/artifactory/api/docker/stz-docker/v2/stz/ltsc2019/mingw64build/blobs/sha256:ba8181afd4264392fbbf8df14fb4cddc55fbe085ab000e986b789678bc2bb171" ] }
拉取新镜像时,除这两个外部层外其余层均可正常拉取,但这两个层多次重试后仍失败,旧镜像则可正常拉取。直接访问MCR的对应URL可正常下载文件,但访问Artifactory的对应URL时返回错误:
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
我们确认Artifactory已配置为允许匿名读取,使用的版本为Arty 7.41.7 rev 74107900。请问该问题的原因是什么,如何解决?
原因分析
- 仓库路径权限未覆盖外部层存储位置:全局匿名读取配置未作用到
stz/ltsc2019/mingw64build这个具体路径,或者该路径的权限规则未授予匿名用户读取权限。 - 外部层未同步到Artifactory:推送新镜像时仅修改了清单中的URL,未将MCR上的外部层blob文件实际同步到Artifactory仓库,导致Artifactory返回权限错误(实际是资源不存在,但权限配置混淆了错误提示)。
- Docker V2 API单独权限限制:Artifactory 7.x版本中,Docker仓库的V2 API访问权限需要单独配置,全局匿名读取可能不覆盖blob路径的访问规则。
解决方案
1. 修复仓库路径的匿名读取权限
- 登录Artifactory管理界面,进入
stz-docker仓库的Permissions配置页。 - 检查是否存在针对
stz/ltsc2019/mingw64build路径的权限规则,确保anonymous用户组拥有Read权限。 - 若无对应规则,添加新规则:指定路径为
stz/ltsc2019/mingw64build,授予anonymous组Read权限,保存后测试访问。
2. 手动同步外部层到Artifactory
使用skopeo工具将MCR上的外部层同步到目标仓库:
skopeo copy docker://mcr.microsoft.com/windows/servercore@sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f docker://docker.securethingz.com:443/artifactory/stz-docker/stz/ltsc2019/mingw64build skopeo copy docker://mcr.microsoft.com/windows/servercore@sha256:ba8181afd4264392fbbf8df14fb4cddc55fbe085ab000e986b789678bc2bb171 docker://docker.securethingz.com:443/artifactory/stz-docker/stz/ltsc2019/mingw64build
同步完成后重新拉取镜像测试。
3. 检查Docker仓库的V2 API配置
- 进入ArtifactoryAdministration > Repositories > Docker > stz-docker配置页,确认
Enable Docker V2 API已开启。 - 检查Advanced设置中的
Allow Anonymous Pull是否勾选,部分版本中该选项需单独开启,不依赖全局匿名读取配置。
4. 验证blob文件的存在性
- 在ArtifactoryArtifacts页面,导航到
stz-docker/stz/ltsc2019/mingw64build/blobs/sha256/路径,确认两个外部层的blob文件是否存在。 - 若不存在,需重新推送镜像或手动上传对应blob文件。
内容的提问来源于stack exchange,提问作者pete neal
相关产品推荐
相关产品推荐

