为什么 Skaffold 在构建到本地 docker 守护进程时要维护两个标签?

Why does Skaffold maintain two tags when building to the local docker daemon?

a different question 中提问:

why does skaffold need two tags to the same image?

在部署期间,Skaffold 重写正在部署的 Kubernetes 清单中的镜像引用,以确保集群拉取新建的镜像并且不使用陈旧的副本(阅读 imagePullPolicy 和一些它试图解决的问题)。 Skaffold 不能只使用计算图像标签,因为许多标签约定不会生成唯一标签,并且标签可以被其他开发人员覆盖并指向不同的图像。一组开发人员或并行测试将图像推送到同一个图像存储库并遇到标签冲突的情况并不少见。例如,latest 将被下一个构建覆盖,默认的 gitCommit 标记器生成像 v1.17.1-38-g1c6517887 这样的标签,它使用最新版本标签和当前提交的 SHA,所以不是在未提交的源更改中是唯一的。

推送到注册表时,Skaffold 可以使用图像的 摘要,即 gcr.io/my-project/image:latest@sha256:xxx@ 之后的部分。此摘要是图像配置和层的哈希值,并唯一标识特定图像。当有摘要时,容器运行时会忽略标记(此处为latest)。

当将图像加载到 Docker 守护进程时,就像部署到 minikube 时发生的那样,Docker 守护进程不维护图像摘要。因此,Skaffold 使用 计算摘要 使用第二个标签来标记图像。两张 不同的 图像极不可能具有相同的计算摘要,除非它们是同一图像。

标签很便宜:它们就像符号链接,指向图像标识符。