我发现gcr.io
推送带有特定标签的Docker映像时:
gcr.io/myproject/myimage:mytag
如果该图像/标签组合已经存在,则似乎取消了对原始图像的标签,上传了新图像,并将标签应用于新图像。
这导致我的存储库中出现大量带有相同图片的未标记版本。
如何测试{/ {1}}中图像/标签组合是否已经存在,以便仅在需要时才推送?
答案 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 API到List 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-tags
(documentation here)
并使用mytag
标志过滤匹配--filter
的标签
并使用--format=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