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

2024-03-08

我使用构建管道管理 gitlab。所有组件都封装在来自官方 gitlab 维护者的 docker 镜像中。

每当我更新时(通常每周一次),我需要检查 gitlab/gitlab-runner-helper 是否仍然适用于当前最新版本的 gitlab。这只能通过执行管道来检查。如果它不起作用,日志会准确地告诉我它需要什么图像,然后我继续提取它。

该图像还标有latest标签,由于对非易失性标签的硬依赖,我无法使用它。

$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

然后,对于每个标签,一个清单:

GET http://<registry>/v2/<repository>/manifests/<tag>

每个清单都有一个与其关联的哈希值,您应该能够从响应的 HTTP 标头中获取该哈希值。您甚至可以对其发出 HEAD 请求并避免清单有效负载的其余部分,但我最近没有尝试过这一点。

现在您有了标签和清单哈希值的列表,您只需找到哈希值与latest tag.

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


Script:

#!/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文件中尚未存在,这并不意味着它是最新的。有时会出现标签,最终将成为最新版本。这些标签将被探测,但不会被插入到文件中。如果这些版本将被跳过为最新版本,这可能会成为将来的一个问题。

Note:上面的脚本仅关注标签的特定子集(x86_64).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何提取 docker 镜像的所有替代标签? 的相关文章

随机推荐

  • 在 SQLServer 作为 sessionState 模式的 ASP.NET 中,如何处理会话对象超时?

    当您将 SQL Server 设置为 ASP NET 应用程序中的状态处理程序时 如何或在何处处理会话超时 是 NET框架在从数据库加载会话对象后判断对象是否过期 还是SQL Server本身负责处理这个问题 我怀疑 甚至考虑 后一种可能性
  • 如何在 Perl 中使用反引号捕获两个不同变量中的 STDOUT 和 STDERR

    假设我想从带有反引号的脚本中运行外部程序 同时我想捕获 STDOUT 和 STDERR 但在两个不同的变量中 我怎样才能做到这一点 例如 如果我运行这个脚本 my cmd snmpwalk v version c community hos
  • python 只读类属性

    有没有办法在Python中创建只读类属性 前任 在Unity3d中你可以这样做 transform position Vector3 zero Vector3 zero 返回 Vector3 类的实例 其中 x y 和 z 均为 0 这与以
  • IDataErrorInfo:提交页面时进行验证

    我正在创建一个 WPF 应用程序 它将使用IDataErrorInfo数据验证 我的业务对象实现的 我一直在与这个演示来自博客文章 http www codegod de WebAppCodeGod WPF IDataErrorInfo a
  • 根接口属性无法通过 Html 助手中的父接口访问

    我觉得我在这里缺少一些基本的东西 我有2个接口 一种称为 IIdentABLE 它指定 Id 属性的存在 第二个实际上可以是任何可识别的东西 请参阅下面的代码 public interface IIdentifiable Guid Id g
  • 带进度条的 Tkinter GUI

    我有一个简单的 Tk GUI 和一个附加到按钮的函数中的长流程 我想要一个进度条 当我点击按钮时 就像它开始一个漫长的过程一样 我怎样才能做到这一点 这是我当前的代码 from tkinter import Button Tk HORIZO
  • Gradle 测试命令未运行任何测试

    我有一个可以在 Android Studio 上运行的简单测试实现 这个类位于我的项目的 src androidTest 目录中 应用程序测试 java public class ApplicationTest extends Applic
  • 通过开始和结束索引抓取 List 的一部分

    这可能吗 例如 如果我有 List
  • 使用 C、gcc、C99 和宏优化微控制器的简约 OOP

    我经常必须用 C 语言对微控制器进行编程 因为 C 编译器通常不可用 或者由于各种错误而无法编写极小的代码 但很多时候 OOP 语法糖 在使硬件程序封装得更清晰 易于维护方面非常方便 所以我想找出是否有一种方法可以在 C 中执行 OOP 语
  • Objective-C 如何检查字符串是否为空

    所以 我想检查我的数组中是否有该项目 clientDataArray objectForKey ClientCompany is nil temp clientDataArray objectForKey ClientCompany if
  • 如何用PHP生成随机密码?

    或者有没有自动生成随机密码的软件 只需构建一串随机数a z A Z 0 9 或者任何你想要的 直到所需的长度 这是 PHP 中的示例 function generatePassword length 8 chars abcdefghijkl
  • 为restify.js 实现基于令牌的身份验证的最佳方法是什么?

    我正在尝试使用restify js 构建一个RESTful api 但我不想将该api 暴露给所有人 我将使用基于令牌的身份验证 我脑子里的流程是这样的 不知道是否合理 用户将用户名 密码发送到 api 来获取令牌 此令牌应包含在调用所有其
  • Python 对新实例的交替引用

    这些天我一直在玩Python 我意识到Python如何将id 地址 分配给新实例 int和list 的一些有趣的方式 例如 如果我继续使用一个数字 或两个不同的数字 调用 id 函数 它会返回相同的结果 例如 gt gt gt id 123
  • 使用 JSON 键作为嵌套 JSON 中的属性

    我正在 python 2 7 中使用嵌套的类似 JSON 的数据结构 我与一些外国 perl 代码进行交换 我只是想以更Pythonic的方式 处理 这些列表和字典的嵌套结构 所以如果我有这样的结构 a x 4 y 2 3 a 55 b 6
  • 表格视图单元上的步进器(快速)

    我将步进器的出口和操作放入表格视图单元格中 并使用协议委托将其连接到表格视图 当我点击第一行中的步进器时 步进器值在第一行中正常显示 但它也出现在某个随机行中 如何解决这个问题 表格视图单元格 protocol ReviewCellDele
  • WPF 工具包数据网格 - 自定义选项卡

    我有一个包含 3 列的 WPF 工具包 DataGrid 只有第三列允许数据输入 前两列是静态的 文本描述 是否可以控制选项卡和导航 以便选项卡和上下左右按钮将忽略前两列并在第三列的范围内运行 您可以使用以下命令禁用前两列上的制表符IsTa
  • oracle FOR LOOP 不在 SYS_REFCURSOR 中迭代

    程序如下 打开游标 然后通过批量收集获取选择查询的输出 问题是所有 ID 都存储在批量收集中 但我无法使用批量收集变量作为输入来循环第二个选择查询 它只考虑第一个 ID 而不是全部 输出应该是 SYS REFCURSOR 请说明我在这里缺少
  • 使用layout/main.xml 文件将选项卡添加到Android 应用程序

    我从 Android 开始 想向现有应用程序添加选项卡 现在我只有一项活动 其布局是在 XML 文件中定义的 我现在想添加其他选项卡 我查了一下发现http developer android com resources tutorials
  • 如何让 Holo Light 主题在我的 Xamarin 应用程序中工作

    我正在尝试让我的应用程序使用 Holo Light 主题 我为 Holo 创建了一个自定义主题并将其放入 资源 values v11 Fsd Theme xml
  • 如何提取 docker 镜像的所有替代标签?

    我使用构建管道管理 gitlab 所有组件都封装在来自官方 gitlab 维护者的 docker 镜像中 每当我更新时 通常每周一次 我需要检查 gitlab gitlab runner helper 是否仍然适用于当前最新版本的 gitl