And*_*ndy 6 docker gcloud google-kubernetes-engine google-container-registry
gcr.io当我推送带有特定标签的 docker 镜像时,我注意到了这一点:
gcr.io/myproject/myimage:mytag
Run Code Online (Sandbox Code Playgroud)
如果该图像/标签组合已经存在,它似乎会取消原始图像的标签,上传新图像,并将标签应用于新图像。
这导致我的 repo 因同一图像的许多未标记版本而变得臃肿。
如何测试图像/标签组合是否已存在于 中gcr.io,以便仅在需要时推送?
这是我在 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
Run Code Online (Sandbox Code Playgroud)
解释
我正在使用gcloud container images list-tags(此处的文档)
并mytag使用--filter标志过滤匹配的标签
并使用格式化为 JSON --format=json
所以本质上,如果标签mytag 不存在,则 this 的输出将是一个空数组[],否则,它确实存在。您可以仅通过脚本中的字符串比较来测试这一点,然后进行相应的操作。
方法 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 用户名/密码,然后使用Docker Registry v2 API列出镜像标签或直接查询用于使用tag.
例如,如果您有一个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
Run Code Online (Sandbox Code Playgroud)
如果您收到 200 OK 响应,则表示该标签存在。