如何测试gcr.io中是否已经存在docker映像的特定标签?

时间:2019-03-25 17:11:28

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

我发现gcr.io推送带有特定标签的Docker映像时:

gcr.io/myproject/myimage:mytag

如果该图像/标签组合已经存在,则似乎取消了对原始图像的标签,上传了新图像,并将标签应用于新图像。

这导致我的存储库中出现大量带有相同图片的未标记版本。

如何测试{/ {1}}中图像/标签组合是否已经存在,以便仅在需要时才推送?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

方法1:假设您的docker命令具有gcr凭据,则可以尝试拉取docker pull gcr.io/foo/image:tag之类的图像。这会很慢,但这是有保证的方式。

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

方法3:如果这两种解决方案都不适合您,您可以学习如何将Google Cloud Service帐户用作docker用户名/密码here,然后使用Docker Registry v2 APIList Image Tags或直接与tag一起Query the image manifest for pulling the image

例如,如果您有一个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响应,则表明该标签存在。

答案 2 :(得分:0)

这是我在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-tagsdocumentation here

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

  • 并使用--format=json

  • 格式化为JSON

从本质上讲,如果标签mytag 不存在,则其输出将为空数组[],否则它确实存在。您只需在脚本中通过字符串比较就可以真正测试它,然后进行相应的操作。

答案 3 :(得分:0)

上面有一些很好的答案。但我只想再提供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