go-containerregistry push和docker push的layer_id不一致原因分析

本文探讨了使用go-containerregistry库push Docker镜像时与docker push产生的layer_id不一致的原因。分析发现,差异源于go-containerregistry在推送过程中对layer.tar进行了额外的压缩,导致计算的sha256值变化。通过调整代码,避免这一额外压缩,可以使layer_id与docker push保持一致。同时,文章还简要介绍了docker pull的原理,包括manifest和image config在其中的作用。
摘要由CSDN通过智能技术生成

问题

使用go-containerregistry库 push image 时和 docker push image 时的layer hash不一致

### 本地docker push推送镜像 ###
# docker push 192.168.1.1:30500/alpine-java:1.0.0
The push refers to repository [192.168.1.1:30500/alpine-java]
372aafbe5d64: Preparing
5b7df235d876: Preparing
### 拉取go-containerregistry推送到registry的镜像 ###
# docker pull 192.168.1.1:30500/alpine-java:1.0.0
1.0.0: Pulling from alpine-java
4d23f0108a5c: Pull complete
20ec70f16685: Pull complete
Digest: sha256:ee64093d46b7c9f6e9676deca8b8e10ac935ab2970f1b25d24c06182872f265a
Status: Downloaded newer image for 192.168.1.1:30500/alpine-java:1.0.0

分析

  1. 两种方式push后,docker inspect 两个image后,发现内容是一致的,说明其实push的是同一个镜像
    在这里插入图片描述(左边是机器上docker inspect的结果,右边是本地docker inspect结果。rootfs:容器只读的文件系统)

  2. docker save -o两个image的tar包后,解压比对manifest.json文件
    在这里插入图片描述
    (左边是docker push manifest.json,右边是go-containerregistry push manifest.json)

  3. 通过分析go-containerregistry源码发现,推送的image layer_id实际上是对layer.tar做了“再压缩”后计算的sha256 commit到manifest.json导致sha256发生变化。从而导致与docker push的layer sha256不一致。
    在这里插入图片描述(go-containerregistry代码计算的layer_id,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值