docker image 的sha256 digest摘要

背景:

sha256 digest摘要信息到底是用来干啥的?

harbor从2.0.0版本开始,docker pull命令复制下来的镜像名长这样:

docker pull harbor.avlyun.org/c-web/integration@sha256:38f3f34301cec3cabd9de3f65f2b313ed7e44d6b211254e7156d12229c5b459f

ps:@后面的那串东西,其实就是镜像本身的sha256的指纹信息,当然你还是可用通过"镜像地址/镜像名:版本号"来拉取镜像。

探究:

官网说明文档

https://goharbor.io/docs/1.10/working-with-projects/working-with-images/create-tag-immutability-rules/

以下是粗略的翻译:

      默认情况下,用户可以通过docker push命令,多次推送镜像名(imagename:tagname)完全相同的镜像到darbor私有化仓库中,就会导致后一次的推送会把前一次的镜像覆盖掉,导致相同的image tag实际上指向的不同的镜像(镜像内容不同,只是镜像名和tag名相同,在自动化构建过程中,若你一直使用相同的镜像名和latest),同时旧镜像的tag会被改为none;

      导致这个情况出现的原因是,docker的实现上,并没有强制给与image tag和image digest的映射关系。这样在一些场景下,镜像版本就混乱了,image tag不能真实的反应新旧镜像的image version。但是sha256摘要仍然是可靠的,并且总是指向每一次相同的构建,唯一的缺点是sha256的摘要信息不是以人类可读的格式呈现的。

下面这个截图是harbor镜像仓库,特定项目下的一个镜像的历史版本列表,注意红框部分:

docker image 的sha256 digest摘要_第1张图片

如何查看某个镜像的摘要信息?

docker images --digests

可以查看sha256的值:

harbor上的镜像摘要信息和你docker image生成时,自带的那个摘要信息是一致的;

换句话说,摘要信息是在image生成阶段就确定了,不会变更了。可以作为镜像的唯一标志。你如果把镜像当成一个文件,那么sha256的摘要信息就是文件的指纹。

下面额外分享一个给镜像打版本号的规范,

参考某位大佬的jenkins构建流程的日志发现的:

上图是jenkins构建流程的一个截图,重点是红框部分,给镜像的tag定义为"分支名_commitid"

可以借鉴一下,相当于从镜像的tag上,就知道了这次镜像的来源分支是啥,当前分支的最新commitid是多少,便于排查当前镜像所含代码的版本!!!

harbor上面也可以配置镜像的推送规则,例如:不允许同一个镜像(镜像名+tag相同),不能连续推送两次。

 

 

 

你可能感兴趣的:(docker)