Fork me on GitHub

Trouble Shooting —— Docker Pull Image : Filesystem layer verification failed for digest sha256错误

问题现象

除了打包镜像的服务器上可以执行docker pull 192.168.0.34:5000/sample:latest以外,其它任何服务器执行此命令时,都会出现以下错误信息:

8b7054...: Verifying Checksum
Filesystem layer verification failed for digest sha256: 8b7054.....

这使得无法正常使用最新的sample镜像文件。

如果是按分析过程中的方式把8b7054文件夹迁移的话,docker会不断重试去拉取此文件信息,大概结果如下:

8b7054...: (..Retry 10 seconds)
Filesystem layer verification failed for digest sha256: 8b7054.....

分析过程

尝试在服务器上找日志,结果没有可用的日志。

/var/lib/registry下找该sha256的数据,能够找到,尝试移走该文件夹数据。结果执行docker pull命令时,依旧是报错。只好迁移回文件夹。

尝试在网络上寻找解决方案,有的说与源有关系,有的说与docker版本有关系,需要升级版本,大多都没有很好的解决。如果实在搞不定,估计

需要考虑这些方案了。

尝试删除所有sample开发版本相关的image,并重新打包镜像,结果问题依旧。

解决方案

docker build的过程中有很多选项可以使用,尝试将缓存关闭(默认否)、签名关闭(默认否)、清理过程文件(默认是)。

因此切换到jenkinsworkspace下,找到sample文件夹,执行以下命令:

docker build --rm=true --no-cache --disable-content-trust=true -t sample .
docker tag sample 192.168.0.34:5000/sample
docker push --disable-content-trust=true 192.168.0.34:5000/sample

编译打包过程没有任何错误,可以正常发布镜像到registry上。

于是,切换到其他服务器上去执行docker pull,结果一切正常。

没有checksum? 且没有原来失败的sha256 digest

看了下其他镜像成功过的pull日志,也是没有checksum。看来只有出现异常的时候,才会去checksum(待考证)

既然已经成功过,那还是用正常的方式去打包编译及下载。于是删除现有镜像文件,在jenkins上进行工程打包(原始逻辑)。

docker build -t sample:latest .
docker tag sample:latest 192.168.0.34:5000/sample:latest
docker push 192.168.0.34:5000/sample:latest

打包好后,在其它服务器上执行docker pull,一样可以正常使用了。

总结

问题最终通过docker创建镜像时增加了关闭缓存、关闭校验的参数(--rm=true --no-cache --disable-content-trust=true),然后构建出来的镜像pushregistry去重写这个镜像的最新digest值,再重新去掉这些参数再次构建镜像(恢复成正常构建镜像命令)后重新pushregistry。这个问题看样子是由于新构建的镜像无法修改registry上的digest值导致pull的时候报错。

Comments