📜  如何从 docker hub 删除超过 x 天的图像 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:23:46.434000             🧑  作者: Mango

如何从 Docker Hub 删除超过 X 天的镜像 - Shell/Bash

在 Docker Hub 上,我们可以存储和分享 Docker 镜像,但是过多的镜像占用了我们宝贵的存储空间。本文将介绍如何使用 Shell/Bash 脚本来删除 Docker Hub 上超过 X 天的镜像,以保持 Docker Hub 干净整洁。

前置要求

在开始之前,您需要满足以下前置要求:

  • 拥有 Docker Hub 帐户
  • 在本地安装了 Docker
  • 在本地安装了 Bash 脚本
步骤
  1. 登录 Docker Hub

使用以下命令登录 Docker Hub:

docker login

其中,您需要输入您的 Docker Hub 帐户名和密码。

  1. 获取 API Token

在 Bash 终端输入以下命令,获取您的 Docker Hub API Token:

curl -H "Content-Type: application/json" -X POST -d '{"username": "YOUR_USERNAME", "password": "YOUR_PASSWORD"}' https://hub.docker.com/v2/users/login/ | jq -r .token

这里需要替换 YOUR_USERNAME 和 YOUR_PASSWORD 为您的 Docker Hub 帐户名和密码。如果您没有安装 jq 工具,请使用以下命令安装:sudo apt install jq -y。(本命令在 Ubuntu 下测试通过)

您将收到一个长长的字符序列(API Token)。复制它以备后用。

  1. 编写 Bash 脚本

使用您喜欢的编辑器,创建一个新的 Shell/Bash 脚本:

#!/bin/bash
TOKEN=YOUR_TOKEN # 将 YOUR_TOKEN 替换为您的 Docker Hub API Token
THRESHOLD_DAYS=X # 将 X 替换为您的阈值天数

for image in $(curl -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/YOUR_USERNAME/?page_size=10000 | jq -r '.results|.[]|.name'); do
    for tag in $(curl -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/YOUR_USERNAME/$image/tags/?page_size=10000 | jq -r '.results|.[]|.name'); do
        manifest=$(curl -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -H "Authorization: JWT $TOKEN" "https://hub.docker.com/v2/repositories/YOUR_USERNAME/$image/manifests/$tag")
        created=$(echo "$manifest" | jq -r '.history[0].v1Compatibility' | jq -r '.created')
        created_timestamp=$(date -d "${created}" "+%s") # 转换日期为时间戳
        current_timestamp=$(date '+%s')
        diff_days=$(( (current_timestamp - created_timestamp) / 86400 )) # 计算时间差,单位:天
        if [ "${diff_days}" -gt "${THRESHOLD_DAYS}" ]; then # 如果镜像超过阈值天数,则删除
            echo "Deleting image ${image}:${tag} created ${created} (${diff_days} days old)..."
            curl -H "Authorization: JWT ${TOKEN}" -X DELETE "https://hub.docker.com/v2/repositories/YOUR_USERNAME/${image}/tags/${tag}/"
        else
            echo "Skipping image ${image}:${tag} created ${created} (${diff_days} days old)..."
        fi
    done
done

将 YOUR_TOKEN 替换为您的 API Token,将 X 替换为阈值天数。接下来,将 YOUR_USERNAME 替换为您的 Docker Hub 用户名。

该脚本将遍历您的 Docker Hub 仓库中的所有镜像,并计算它们的创建时间。如果镜像超过 X 天,则将其删除。

  1. 运行脚本

使用以下命令运行脚本:

bash script.sh

脚本将开始运行,并显示每个处理的镜像及其创建时间。如果镜像被删除,将显示“Deleting image…”;如果镜像未被删除,则将显示“Skipping image…”。

结论

使用 Shell/Bash 脚本删除 Docker Hub 上超过 X 天的镜像是一项重要的任务,以保持 Docker Hub 干净整洁,确保您拥有足够的存储空间来存储更多的镜像。感谢您阅读本文,希望它对您有所帮助!