如何拉取Docker镜像的所有备用标签

98次阅读
没有评论

问题描述

作为一个管理GitLab实例的管理员,我需要在构建流水线中使用Docker镜像。所有组件都封装在来自官方GitLab维护者的Docker镜像中。

通常每周更新一次,我需要检查gitLab/gitlab-runner-helper是否适用于当前最新版本的GitLab。这只能通过执行流水线来检查。如果不起作用,日志会告诉我需要哪个镜像,然后我会继续拉取它。

需要拉取的镜像也有一个latest标签,但由于对不变标签的硬依赖性,我无法使用它。

以下是示例的镜像列表:

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命令的man页面提到了--all-tags选项,可以从仓库加载任何标记的镜像,但这不能与标记结合使用。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

使用脚本来获取Docker镜像的备用标签。

以下是一个示例脚本,可以拉取指定镜像的所有备用标签:

#!/bin/bash
IMAGE_NAME="gitlab/gitlab-runner-helper"
TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$IMAGE_NAME:pull" | jq -r '.token')
TAGS=$(curl -s "https://registry.hub.docker.com/v2/$IMAGE_NAME/tags/list" -H "Authorization: Bearer $TOKEN" | jq -r '.tags[]')
for TAG in $TAGS; do
  # 跳过latest标签
  if [ "$TAG" != "latest" ]; then
    echo "Pulling $IMAGE_NAME:$TAG"
    docker pull "$IMAGE_NAME:$TAG"
  fi
done

在这个示例中,我们首先定义了镜像的名称,然后使用curljq来获取令牌和标签列表。接着,我们遍历标签列表,跳过latest标签,并使用docker pull命令来拉取每个备用标签的镜像。

方案2

该解决方案使用了一个名为tags.list的文件来保存已处理的标签,以避免重复请求。请根据需要进行适当的更改。

另一个方法是编写一个脚本来获取备用标签,并通过比较镜像的散列值来确定最新版本。

以下是一个示例脚本,用于获取指定镜像的备用标签:

#!/bin/bash
IMAGE_NAME="gitlab/gitlab-runner-helper"
TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$IMAGE_NAME:pull" | jq -r '.token')
TAGS=$(curl -s "https://registry.hub.docker.com/v2/$IMAGE_NAME/tags/list" -H "Authorization: Bearer $TOKEN" | jq -r '.tags[]')

for TAG in $TAGS; do
  if [ "$TAG" != "latest" ]; then
    if grep -Fxq "$TAG" tags.list; then
      continue
    else
      echo "New tag found: $TAG"
      NEW_SHA=$(curl -s "https://registry.hub.docker.com/v2/$IMAGE_NAME/manifests/$TAG" -H "Authorization: Bearer $TOKEN" | jq -r '.fsLayers[] .blobSum')
      LATEST_SHA=$(curl -s "https://registry.hub.docker.com/v2/$IMAGE_NAME/manifests/x86_64-latest" -H "Authorization: Bearer $TOKEN" | jq -r '.fsLayers[] .blobSum')

      if [ "$NEW_SHA" = "$LATEST_SHA" ]; then
        echo "$TAG is the new latest version"
        docker pull "$IMAGE_NAME:$TAG"
        echo "$TAG" >> tags.list
      fi
    fi
  fi
done

在这个示例中,我们使用与前一个脚本类似的方法获取令牌和标签列表。然后,我们检查标签是否已经在tags.list文件中,如果不在则继续处理。我们比较镜像的散列值以确定是否是最新版本。如果是最新版本,则使用docker pull拉取镜像,并将标签写入tags.list文件。

请注意,这两个示例脚本都假设您已经安装了curljq,并且您可能需要根据实际情况进行调整。

方案3

使用第三方工具reg来列出镜像的所有备用标签。请根据工具的文档进行操作。

如果你希望使用第三方工具来管理镜像,你可以考虑使用reg工具来列出镜像的所有备用标签。

请根据工具的文档来使用和配置reg工具。

无论你选择哪种方法,都可以帮助你自动拉取指定镜像的所有备用标签,从而更方便地管理更新过程。

正文完