docker pull镜像报错:‘invalid checksum digest format‘解决
作者:CN-FuWei
镜像推送/拉取报错,排查发现仓库正常但Docker默认连接443端口,配置了安全连接,最终因宿主机443端口被占用,停掉冲突服务后问题解决
一、问题现象
在进行镜像推送时,发生报错:
docker push registry.example.com/nginx:xxx ... xxxx:Layers already exists xxxx:Layers already exists xxxx:Layers already exists xxxx:Layers already exists ... invalid checksum digest format
然后,从镜像仓库拉取镜像,也报错:
docker pull registry.example.com/nginx:xxx Error reponse from daemon : error unmarshalling content: invalid character '<' looking for beging of value
二、排查过程
2.1 检查镜像
docker load -i nginx:xxx docker images|grep nginx
镜像可以导入本地,证明镜像没有问题。
2.2 检查镜像仓库
docker version: 18.09.0
registry version: 1.1.0
检查镜像仓库的运行状态
docker ps |grep registry
绕过docker,通过Docker Registry API拉取镜像 :
curl -X GET http://your-registry/v2/<repository>/manifests/<tag> #将以下内容替换为实际的值: your-registry:你的 Registry 地址(例如,registry.example.com)。 <repository>: 你的镜像仓库名称 <tag>: 你要拉取的镜像标签
这个命令将返回镜像的 manifest(元数据),其中包含有关镜像的详细信息,包括层(layers)和配置。
然后,你可以提取 manifest 中的层信息,并使用 curl
命令拉取每个层。例如:
# 提取镜像的层信息 layers=$(curl -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" http://your-registry/v2/<repository>/manifests/<tag> | jq -r '.layers[].digest') # 拉取每个层 for layer in $layers; do curl -O -J -L http://your-registry/v2/<repository>/blobs/$layer done
最终可以拉取成功,证明registry服务正常。
2.3 检查docker服务
2.3.1 检查服务运行状态
systemctl status docker
2.3.2 检查docker日志
journalctl -xe|grep docker
从这里可以看出docker默认去连接443端口
2.3.3 检查docker配置文件
cat /usr/lib/systemd/system/docker.service
可以看到,已经配置了registry的安全连接。
三、解决方案
通过多次执行docker push可以发现,连接会重置到443端口上,返回的类似是一个html的内容。
检查宿主机的443端口有没有监听:
netstat -tnulp|grep 443|grep LISTEN tcp 0 0.0.0.0:443 0.0.0.0:* LISTEN 101811/./httpServer
可以看到已经有服务监听了443端口,我们需要把这个服务给停掉。
最终镜像可以正常推拉到镜像仓库!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。