docker - 如何提取 docker 镜像的所有替代标签?

标签 docker gitlab gitlab-ci-runner

我管理一个带有构建管道的 gitlab。所有组件都封装在来自官方 gitlab 维护者的 docker 镜像中。
每当我更新时——通常是每周一次——我需要检查 gitlab/gitlab-runner-helper 是否仍然适用于当前最新版本的 gitlab。这只能通过执行管道来检查。如果它不起作用,日志会准确地告诉我它需要什么图像,然后我继续拉它。
有问题的图像也被标记为 latest由于对非 volatile 标签的硬依赖性,我无法使用该标签。

$docker image ls
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
gitlab/gitlab-runner-helper   x86_64-8af42251     1ee5a99eba5f        20 hours ago        43.7MB
gitlab/gitlab-runner-helper   x86_64-latest       1ee5a99eba5f        20 hours ago        43.7MB
为了自动执行我的更新过程,我想知道如何使用所有替代标签提取最新图像?
docker pull 的手册页说,有一个 --all-tags选项,从存储库加载任何标记的图像,但这不能与标记结合使用。

最佳答案

据我所知,没有真正有效或内置的方法来做到这一点。相反,您需要通过 REST 查询您的注册表,首先是该存储库的标签列表:
GET http://<registry>/v2/<repository>/tags/list
然后,对于每个标签,一个 list :
GET http://<registry>/v2/<repository>/manifests/<tag>
每个 list 都有一个与之关联的哈希值,您应该能够从响应的 HTTP header 中获取它。您甚至可以为它发出 HEAD 请求并避免 list 有效负载的其余部分,但我最近没有尝试过。

现在你有一个标签和 list 哈希的列表,你只需要找到所有与 latest 匹配的哈希的标签。标签。

这有点乏味,但实际上用 curl 编写脚本并没有那么糟糕。和 jq ,特别是如果您不需要担心安全性。

脚本:

#!/bin/sh

TOKEN=`curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:gitlab/gitlab-runner-helper:pull" | jq '.token' | sed 's/"//g'`
TAGS=`curl -s https://registry.hub.docker.com/v2/gitlab/gitlab-runner-helper/tags/list -H "Authorization: Bearer $TOKEN" | jq ".tags[]" | sed 's/"//g' | grep x86_64`

for tag in $TAGS;
do
  # is $tag an old entry?
  if grep -Fxq $tag tags.list
  then
    # already processed
    continue
  else
    echo "new tag found: $tag"
    newSHA=`curl -s https://registry.hub.docker.com/v2/gitlab/gitlab-runner-helper/manifests/$tag -H "Authorization: Bearer $TOKEN" | jq ".fsLayers[] .blobSum" | sed 's/"//g'`
    latestSHA=`curl -s https://registry.hub.docker.com/v2/gitlab/gitlab-runner-helper/manifests/x86_64-latest -H "Authorization: Bearer $TOKEN" | jq ".fsLayers[] .blobSum" | sed 's/"//g'`
    if [ "$newSHA" = "$latestSHA" ]
    then
      echo "$tag is new latest version"
      docker pull gitlab/gitlab-runner-helper:$tag
      echo $tag >> tags.list
    fi
  fi
done

上面的脚本使用了一个名为 tags.list 的文件。 ,放在它旁边。此文件包含较旧的标签,以防止发出 500 多个 HTTP 请求。如果来自 TAGS 的标签尚未出现在文件中,这并不意味着它是最新的。有时会出现标签,最终会成为最新版本。这些标签被探测,但不会被插入到文件中。如果这些版本将作为最新版本被跳过,这在将来可能会成为一个问题。

注:上面的脚本只关注特定的标签子集 ( x86_64 )。

关于docker - 如何提取 docker 镜像的所有替代标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52942359/

相关文章:

基于r-base docker镜像docker build时Python包安装问题

python - 在 spacy 中安装后删除 en_core_web_trf .whl 文件

linux - `--oom-kill-disable` 对 Docker 容器有什么作用?

Gitlab:每个用户的搜索提交

gitlab - 在 gitlab ci 中获取分支名称

node.js - GitLab-CI 和 node.js - 如何启动本地服务器然后运行测试?

docker:挂载/var/run/docker.sock后找不到

environment-variables - 如何获得代码质量以仅扫描指定目录?

azure - 如何重新连接到docker实例

git - 优化 GitLab CE 的高内存使用率