【问题标题】:How do I test if a specific tag of a docker image already exists in gcr.io?如何测试 gcr.io 中是否已存在 docker 映像的特定标签?
【发布时间】:2019-08-16 00:13:11
【问题描述】:

我注意到gcr.io 在推送带有特定标签的 docker 映像时:

gcr.io/myproject/myimage:mytag

如果该图像/标签组合已经存在,它似乎会取消原始图像的标签,上传新图像,然后将标签应用于新图像。

这导致我的 repo 变得臃肿,包含许多相同图像的未标记版本。

如何测试gcr.io 中是否已经存在图片/标签组合,以便仅在需要时推送?

【问题讨论】:

    标签: docker gcloud google-kubernetes-engine google-container-registry


    【解决方案1】:

    这是您可以使用gcloud 进行检查的方法:

    gcloud container images describe ${GCR_URL}/${IMAGE_NAME}:${IMAGE_TAG} > /dev/null ; echo $?
    

    【讨论】:

      【解决方案2】:

      上面有几个很好的答案。但我只想再提供 1 个我正在使用的选项。

      #!/bin/bash
      
      REPO_URL=gcr.io/myproject/myimage
      TAG=mytag
      
      TAG_EXISTING="$(gcloud container images list-tags --format='get(tags)' $REPO_URL | grep $TAG)"
      if [ -z $TAG_EXISTING ]
      then
          docker push $REPO_URL:$TAG
      fi
      

      【讨论】:

      • 如果一张图片有很多标签,这是行不通的,因为会有多个页面
      【解决方案3】:

      这是我在 shell 脚本中解决这个问题的方法

      existing_tags=$(gcloud container images list-tags --filter="tags:mytag" --format=json gcr.io/myproject/myimage)
      
      if [[ "$existing_tags" == "[]" ]]; then
        printf "tag does not exist"
      else
        printf "tag exists"
      fi
      

      说明

      我正在使用gcloud container images list-tags (documentation here)

      • 并使用--filter 标志过滤匹配mytag 的标签

      • 并使用--format=json格式化为JSON

      所以本质上,如果标签mytag不存在,那么它的输出将是一个空数组[],否则,它确实存在。您可以通过脚本中的字符串比较来测试这一点,然后进行相应的操作。

      【讨论】:

      • 请注意,如果您不使用 JSON 格式,您将获得“列出的 0 张图片”。没有结果时的消息。使用 JSON 更容易检查[]。谢谢!
      【解决方案4】:

      方法一:假设你的docker命令有gcr凭证,你可以尝试像docker pull gcr.io/foo/image:tag一样拉取镜像。这会很慢,但这是一种有保证的方式。

      方法 2: 假设您的环境中存在 gcloud,您可以运行 gcloud container images list-tags [- -format=json] gcr.io/foo/image 并查看输出是否具有您想要的 tag

      方法三:如果这两种方案对你还不够好,你可以学习如何使用你的谷歌云服务账号作为docker用户名/密码here,然后使用Docker Registry v2 APIList Image Tags 或直接 Query the image manifest for pulling the imagetag

      例如,如果您有一个 gcr.io/foo/alpine:v1 图像,要使用 cURL 和一个临时的 access_token(通过 gcloud 获得)进行测试,您可以运行:

      TOKEN="$(gcloud config config-helper --format 'value(credential.access_token)')"
      
      curl -H "Authorization: Bearer $TOKEN" \
          https://gcr.io/v2/foo/alpine/manifests/v1
      

      如果得到 200 OK 响应,则表示该标签存在。

      【讨论】:

        猜你喜欢
        • 2021-04-25
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2020-08-29
        • 1970-01-01
        • 2023-03-07
        • 2011-06-28
        相关资源
        最近更新 更多