问题现象

从阿里的 Docker 源镜像站点 pull tlcpack/ci-gpu:v0.72 的时候,会出现“unknown blob”的错误,导致 pull 失败。

结论

结论是 tlcpack/ci-gpu:v0.72 里面的某些层需要登录信息才能从官方站点下,而阿里的镜像站点没有把请求 HEAD 里的登录信息传递过去,导致下载失败。所以,只能从官方下。

分析过程

我是在公司内搭了 Artifactory,再设置阿里为远程镜像站点。刚出错的时候一直以为 Artifactory 的问题,因为它在下载时间过长时还是会以可感知的概率出错。于是就删除已下的缓存,在通过 Settings 清空回收站,通过 Maintenance 清理所有可能的内置缓存。再试还是出问题。

通过 Artifactory 提供的功能已经没法做进一步分析了。而 Docker 又没有提供功能去查看 pull 时具体的出错的信息。那有没有可能自己直接请求出错的层看返回什么错误呢?Docker 这么热门,我猜应该是有人干过这事的。功夫不负有心人,让我找到 docker-drag,是用 python 写的,脱离 Docker 直接下载。通过修改他的代码,找到是 sha256:2f4e9c53dfa48caec183f2866cf2b9d385387eb89292b663189c6d8a6e055dfa 这一层出问题了,URL 是 https://hilizbo8.mirror.aliyuncs.com/v2/tlcpack/ci-gpu/blobs/sha256:2f4e9c53dfa48caec183f2866cf2b9d385387eb89292b663189c6d8a6e055dfa。返回信息是:

{"errors":[{"code":"UNKNOWN","message":"unknown error","detail":{"Op":"Head","URL":"https://registry-1.docker.io/v2/tlcpack/ci-gpu/blobs/sha256:2f4e9c53dfa48caec183f2866cf2b9d385387eb89292b663189c6d8a6e055dfa","Err":{"code":"UNAUTHORIZED","message":"incorrect username or password"}}}]}

我们看到这里已经提示用户名或密码错误了。这里提供了原始 URL,我们不清楚是否阿里做了什么加工出错,我们不妨试试原始 URL。返回以下信息:

{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"tlcpack/ci-gpu","Action":"pull"}]}]}

这就很明确了,就是缺少登录信息。

我们再修改代码,让 docker-drag 跳过其他下载,直接下载这个有问题的链接,并加上登录信息,发现其实是可以下载的。也就是说,下载这个不需要具体的用户的登录信息,匿名登录信息就可以了。因此,修改 Artifactory,不用阿里镜像源,直接用官方的,并传递 HEAD 过去就好了。

发表回复

您的电子邮箱地址不会被公开。