如何在Jenkins中清理Docker注册表中的旧镜像

65次阅读
没有评论

问题描述

在使用Jenkins进行多分支项目构建时,每次提交都会构建并将镜像推送到私有注册表。镜像的标签格式如下:

docker-reg:5000/<project>/<branch>:latestdocker-reg:5000/<project>/<branch>:<build-server>-<build-number>

用户希望知道如何在Docker注册表中删除不再需要的标签,以便垃圾回收程序可以清理这些镜像。具体来说,用户希望在以下情况下删除标签:
1. 构建在一段时间后变为孤立状态:删除 <project>/<branch>:<build-server>-<build-number> 标签。
2. 分支被合并并且Jenkins子项目被自动删除:删除 <project>/<branch>:latest 标签。

解决方案

请注意以下操作可能涉及删除镜像等操作,确保在执行操作前做好备份。

使用脚本定期清理孤立镜像

您可以编写一个定期运行的脚本,用于扫描Docker注册表以查找孤立的镜像,并将其删除。以下是一个简单的示例脚本,您可以根据实际情况进行修改:

#!/bin/bash
REGISTRY_URL="docker-reg:5000"
PROJECT="<project>"
# 获取所有镜像列表
ALL_IMAGES=$(curl -s "$REGISTRY_URL/v2/$PROJECT/tags/list" | jq -r '.tags[]')
# 循环遍历镜像列表
for IMAGE_TAG in $ALL_IMAGES; do
  # 判断是否是符合要删除的条件的镜像标签
  if [[ $IMAGE_TAG != "latest" && $IMAGE_TAG != v* ]]; then
    # 删除镜像
    curl -X DELETE "$REGISTRY_URL/v2/$PROJECT/manifests/$IMAGE_TAG"
    echo "Deleted image with tag: $IMAGE_TAG"
  fi
done

在上面的示例中,脚本使用Curl来与Docker注册表的API进行交互,通过API获取镜像标签列表并进行筛选。请根据您的实际情况修改REGISTRY_URLPROJECT变量。该脚本将删除不再需要的镜像,其中条件是标签不是”latest”也不以”v”开头。

使用API删除基于最后修改日期的镜像

如果您希望基于镜像的最后修改日期来进行清理,您可以编写一个脚本,通过Docker注册表的API获取镜像信息,然后根据最后修改日期来删除镜像。这需要多次API调用以获取所需的数据,并且可能稍微复杂一些。

其他注意事项

  • 这些操作可能会涉及到对镜像的删除,务必在执行之前备份所有重要的镜像。
  • 对于自动清理的任务,您可以使用定时任务(如Cron)或将其作为Jenkins的定期构建任务来运行。
  • 请确保您对Docker注册表和Jenkins有足够的权限来执行这些操作。

请注意,Jenkins本身没有直接支持删除镜像的功能,上述方案都是基于API和脚本的方式来实现清理操作。

以上是在Jenkins中清理Docker注册表中的旧镜像的解决方案。根据您的实际需求,选择适合您情况的方法来进行镜像清理操作。

正文完