docker pull镜像报错:‘invalid checksum digest format‘

一、问题现象

在进行镜像推送时,发生报错:

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端口,我们需要把这个服务给停掉。

最终镜像可以正常推拉到镜像仓库!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN-FuWei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值