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

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,以便仅在需要时推送?

dav*_*wil 6

这是我在 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 的输出将是一个空数组[],否则,它确实存在。您可以仅通过脚本中的字符串比较来测试这一点,然后进行相应的操作。


Ahm*_*gle 3

方法 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 响应,则表示该标签存在。