首页 > 解决方案 > 双重标记 docker 图像(最新 + 设置版本)+ 将最新部署到 k8s + 然后查找真实标签?

问题描述

我想在构建/泊坞窗推送时对泊坞窗图像(最新 + 版本,例如 1.3.0-78)进行双重标记。

然后我想将我的所有应用程序部署到具有最新标签的 kubernetes,如果测试通过,则从我可以从与“最新”相关联的 kubernetes 获得的图像摘要中查找“真实”标签(1.3.0-78),然后创建所有 docker 标签的清单作为发布候选。

不幸的是,我还没有找到仅基于摘要找到“真实”标签的好方法。

看来您必须迭代整个存储库中的所有标签并寻找匹配的摘要。鉴于特定图像可能有数百或数千个标签,这可能需要很长时间。

这是一个脚本,可以找到所有具有相同摘要的标签,但速度很慢:

REPOSITORY=$1
TARGET_TAG=$2


# find all tags
ALL_TAGS=$(curl -s  $REPOSITORY/tags/list | jq -r .tags[])

# get image digest for target
TARGET_DIGEST=$(curl -s -D -  -H "Accept: application/vnd.docker.distribution.manifest.v2+json"   $REPOSITORY/manifests/$TARGET_TAG | grep Docker-Content-Digest | cut -d ' ' -f 2)

# for each tags
for tag in ${ALL_TAGS[@]}; do
  echo "checking tag ${tag}"
  # get image digest
  digest=$(curl -s -D -  -H "Accept: application/vnd.docker.distribution.manifest.v2+json" $REPOSITORY/manifests/$tag | grep Docker-Content-Digest | cut -d ' ' -f 2)

  # check digest
  if [[ $TARGET_DIGEST = $digest ]]; then
    echo "$tag $digest"
  fi
done

有没有人有另一种方法?

标签: dockerkubernetes

解决方案


然后我想用最新的标签将我所有的应用程序部署到 kubernetes

不,你肯定不会;您想使用发布候选图像创建 GitLab 所称的环境,然后Deployment如果一切顺利,则将 RC 提升为真实环境。在几乎所有情况下,使用:latest都是灾难的秘诀。

如果您坚持使用:latest,那么我建议将“真实”图像标签放在临时的注释、标签或环境变量中,Deployment这样您以后就可以获取该信息,不仅是为了您的理智,而且还可以使其可用到大概是拆除临时堆栈并将图像提升到生产堆栈的过程。


推荐阅读