从 Google Container Registry 中删除镜像并上传另一个具有相同标签的镜像后,删除的仍然被拉取
After deleting image from Google Container Registry and uploading another with the same tag, deleted one is still pulled
我不知道这是 GCR 中的预期行为还是错误。
基本上我试过这样做:
- 在 Windows(基于 Linux 的图像)上使用 Docker 从本地文件创建图像。
- 在创建图像之前,我删除了具有相同 name/tag 的所有本地图像。
- 图像被标记为 repostiory/project/name:v1
- 在本地测试时图像具有正确版本的可执行文件(docker 运行 imageID)。
- 在将图像推送到 GCR 之前,我从 GCR 中删除了具有相同 tag/name 的所有图像。
- 当尝试从 GCR 提取新图像到 kubernetes 示例时,它会提取在特定标签下上传的第一个(有史以来)图像。
我想重复使用同一个标签,而不是每次测试都更改配置文件,而且我真的不需要存储以前版本的图像。
听起来您遇到了 kubernetes/kubernetes#42171 中描述的问题。
tl;dr,kubernetes 的默认拉取策略被设计破坏,因此您不能重复使用标签 (other than latest
)。我相信 k8s 社区的指导是使用 "immutable tags",这有点矛盾。
您有几个选择:
- 切换到使用
latest
标签,因为 kubernetes 已经在他们的 default pull policy logic 中对此进行了硬编码(我相信这是为了缓解您遇到的问题)。
- 切勿重复使用标签。
- 切换到显式使用
PullAlways
ImagePullPolicy。如果这样做,您将产生少量开销,因为您的节点将必须向注册表检查标签是否未更改。
- 切换到使用
PullIfNotPresent
ImagePullPolicy 按映像摘要部署。我链接的 PR 中有更详细的解释,但这可以让你两全其美。
我不知道这是 GCR 中的预期行为还是错误。 基本上我试过这样做:
- 在 Windows(基于 Linux 的图像)上使用 Docker 从本地文件创建图像。
- 在创建图像之前,我删除了具有相同 name/tag 的所有本地图像。
- 图像被标记为 repostiory/project/name:v1
- 在本地测试时图像具有正确版本的可执行文件(docker 运行 imageID)。
- 在将图像推送到 GCR 之前,我从 GCR 中删除了具有相同 tag/name 的所有图像。
- 当尝试从 GCR 提取新图像到 kubernetes 示例时,它会提取在特定标签下上传的第一个(有史以来)图像。
我想重复使用同一个标签,而不是每次测试都更改配置文件,而且我真的不需要存储以前版本的图像。
听起来您遇到了 kubernetes/kubernetes#42171 中描述的问题。
tl;dr,kubernetes 的默认拉取策略被设计破坏,因此您不能重复使用标签 (other than latest
)。我相信 k8s 社区的指导是使用 "immutable tags",这有点矛盾。
您有几个选择:
- 切换到使用
latest
标签,因为 kubernetes 已经在他们的 default pull policy logic 中对此进行了硬编码(我相信这是为了缓解您遇到的问题)。 - 切勿重复使用标签。
- 切换到显式使用
PullAlways
ImagePullPolicy。如果这样做,您将产生少量开销,因为您的节点将必须向注册表检查标签是否未更改。 - 切换到使用
PullIfNotPresent
ImagePullPolicy 按映像摘要部署。我链接的 PR 中有更详细的解释,但这可以让你两全其美。