先清理mainfests

方法1 - Cleanup Policies

查看docker repo

比如你的docker repo名字叫做test-repo,然后在nexus3首页的seatch下面找到docker,点进去随便查看一个已经上传的镜像

记住上面的Name选项,之后要用到

设定清理策略(clean policies)

在nexus3 设置中找到 Cleanup Policies

点击 Create Cleanup Policy 创建一个新的清理策略

注意到Asset Name Matcher区域,这里可以填写RE表达式,过滤的是第一步中得到的Name选项。
比如你想要过滤所有以clean结尾的rabbitmq镜像,你可以这么编写你的表达式:

1
v2/rabbitmq/manifests/.*-clean

如果你想要清理所有的镜像,而不只是rabbitmq

1
v2/.*/manifests/.*-clean

当然你也可以根据情况选择是否设置镜像过期时间一起配合使用(注意这里的三个条件是逻辑与的关系)
配置完成后,不要忘了点击下方进行预览,以免失误删除了其他镜像。

配置完成后点击 Save按钮保存。

应用清理策略

同样是在设置页面点击Repositories,点击要配置的 docker repo

Cleanup区域找到 刚刚创建的策略,并将其加入到右侧 Applied一栏,然后点击下方Save按钮保存。
至此完成策略的应用

立即执行清理任务

在应用清理策略后,nexus3默认会创建一个自动清理的任务,该任务在每天凌晨一点钟自动执行。如果立即手动执行,可以在设置页面找到 Tasks面板,找到刚才说的自动清理任务。

找到名为 Cleanup service的默认任务

在任务面板点击`Run`即可立即执行清理计划。

方法2 - nexus-cli镜像清理工具

注: 如果报错.crendetials file not found,则重新执行nexus-cli

下载nexus-cli镜像清理工具

早期的nexus-cli已经没有维护,nexus-cli删除的镜像并没有按照时间的顺序进行保留 。需要在13rentgen的仓库中下载修复版的,所以需要下载最新的修复版本

1
2
curl -sSL https://github.com/13rentgen/nexus-cli/releases/download/v1.1.0/nexus-cli -o /usr/local/bin/nexus-cli
chmod +x /usr/local/bin/nexus-cli

nexus_images_del.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env bash
# 获取镜像列表,转换为数组
imgStr=$(nexus-cli image ls|awk 'NR > 1 { print prev } { prev = $0 }')
imgs=(${imgStr})
# 遍历数组删除镜像
for img in "${imgs[@]}"; do
# 可选1:统一保留5个镜像
# nexus-cli image delete -n "$img" -k 5
# 可选2:按环境配置各自保留多少个镜像【以production开头的镜像tag保留15个,其他保留5个】
if [[ "$img" == production* ]]; then
nexus-cli image delete -n "$img" -k 15
else
nexus-cli image delete -n "$img" -k 5
fi
echo "Deleted image $img"
done

配置crontab

1
2
3
4
5
[root@VM-30-197-centos ~]# crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
MAILO=root
30 02 * * * sh /opt/docker/nexus_images_del.sh

配置nexus-cli

1
2
3
4
5
6
nexus-cli configure 
# 末尾不要带/
Enter Nexus Host: http://127.0.0.1:8081
Enter Nexus Repository Name: docker.repo
Enter Nexus Username: admin
Enter Nexus Password: xxxxxx

附录:nexus-cli常用命令

命令说明命令
查看当前仓库中所有镜像nexus-cli image ls
查看某一镜像的所有的tagnexus-cli image tags -name $IMAGE_NAME
查看某一镜像详细信息nexus-cli image info -name $IMAGE_NAME -tag $TAG
删除指定tag的指定镜像nexus-cli image delete -name $IMAGE_NAME -tag $TAG
仅保留最新的X个tag,其余全部删除nexus-cli image delete -name $IMAGE_NAME -keep X
清理具体的镜像,保留版本号最大的1个nexus-cli image delete -n ${img_name} -k 1

说明:-keep参数不能为0,所以如果该镜像只有一个tag,我们想删除,那就只能根据tag来删除

配置镜像清理的Task

上面的操作执行后,虽然镜像是删除了,但是磁盘空间还没有释放出来,因此需要我们进行以下操作来清理物理磁盘

配置Delete unused docker manifests and images

该任务仅可以配置为N个小时内未被使用的镜像将被删除

在 Nexus 中,Delete unused docker manifests and images task(删除未使用的 Docker manifests 和镜像任务)是一项定期运行的任务,用于清理仓库中未被使用的 Docker manifests 和镜像。

这个任务会检查每个 Docker 仓库中所有的 manifests 和镜像,并删除那些没有被任何 tag 引用的 manifests 和镜像。这样可以帮助释放磁盘空间,减少无用数据的占用,提高存储效率。

通过运行 Delete unused docker manifests and images task,可以避免仓库中出现大量未被使用的镜像和 manifests,减少磁盘空间的使用和运维成本。

再配置 Compact blob store(此步会消耗资源进行压缩,建议选择时间段在凌晨)

在 Nexus 中,Compact Blob Store Task(压缩式 Blob 存储任务)是一项定期运行的任务,用于压缩 Compact Blob Store 中的 Blob 文件。

Compact Blob Store Task 通过查找不再使用的 Blob 文件来减小磁盘空间占用,它会将这些文件压缩成单个存档文件,从而减少文件数量和磁盘空间占用。

通过运行 Compact Blob Store Task,可以使 Blob 存储更加高效和节省空间。这对于需要长时间保存大量文件的仓库来说特别重要,可以减少磁盘空间的使用和运维成本。