批量删除harbor中的镜像
一 说明
这个是我第一篇博客,所以我想放上原创的东西,尽管我一直都很担心自己写得太low,但是总要学会尝试,学会改变自己,相信自己。在写这个脚本时,由于我接触LInux不是很多,能力有限,仅仅是为了让自己心情好点,可以说只是为了完成任务,并没有考虑其中比如代码重复,注释不完整等诸多问题。这是9月份做的事情了,因为各种原因,后续也没去关注脚本中问题。请多多包含。
二 背景
公司最近在搞关于k8s的东西,我也跟着参与进去了。在学习和使用了一段时间之后,发现Habor中的镜像越来越多,因为我们是采用以当前时间作为镜像的标签,所以几个月之后,发现磁盘容量剩余不多了,决定要删除之前的一些已经确定不会再使用的镜像。于是,我就手动删除了最早一个月的镜像,结果搞得我很不爽,这样子太慢了,太消耗时间了。于是想,通过脚本删除岂不是更好么?这样子很快的就能够删除那些没用的镜像了,省得我心烦。后来网上找了一下,发现并没有类似的脚本之类的。于是,决定根据官网所提供的接口自己来写一个脚本。当时在了解了之后,决定用shell,python也是可以的 ,不过我还在学习的路上。所以决定先用shell,后学学成再改到用python。在此过程中,非常感谢我的一个同事陪我一起进行了测试和验证。
三 具体思路
首先,我们的harbor中的项目都是公有的,harbor的访问时通过域名,采用https,镜像以当前时间为标签,比如201810121420 201807081234。执行删除脚本时,先告诉你目前harbor下有那些项目,让你选择项目,根据你选择的项目去查询它下面有哪些仓库,让你输入仓库,再去查询其下面有哪几种镜像格式,如10月的镜像格式为201810;再根据你输入的镜像格式去删除以镜像格式删除的镜像,就是如果你选择201810,则2018年10月的所有镜像都会被删除,最后告知你删除了多少个镜像。脚本执行后,磁盘空间并不会释放,还是需要停止Harbor进行回收。
四 脚本内容
脚本我放在了github上,地址:https://github.com/zhouhua-amei/docker
#! /bin/bash
# 通过Harbor提供的API来批量删除镜像,人工删除费时费力
# 经过测试发现,通过接口去删除时提供的是的标签,但实际上删除的时候通过的是镜像的IMAGE_ID,也就是说
# 如果我把同一个镜像tag多次上传到harbor,通过借口删除时,只需要提供其中一个标签,那么和这个镜像的IMAGE_ID相同的镜像都会删除 #### 项目个数
lines=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep "\"name\""|awk -F "\"" '{print $4}'|wc -l`
##### 展示当前有几个项目
echo "当前Harbor有以下几个项目:"
for i in $(seq 1 $lines)
do
###########具体是啥项目
a=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep "\"name\""|awk -F "\"" '{print $4}'|awk -v b=$i 'NR==b{print $1}'`
echo $i、$a
done
#######选择具体的项目
read -p "请输入序号(1~$lines):,查看其下的镜像仓库:" number
if [ $number -ge 1 -a $number -le $lines ]
then
#########选择的是哪个项目
c=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep "\"name\""|awk -F "\"" '{print $4}'|awk -v b=$number 'NR==b{print $1}'`
#####多少个仓库
d=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/projects?" |grep "$c" -C 2 |grep "project_id" |awk '{print $2}' |awk -F "," '{print $1}'`
#echo "\$d-----------$d"
######显示仓库个数
## e=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=$d" | grep "\"name\"" |awk -F "\"" '{print $4}' |awk -F "/" '{print $2}'|wc -l`
e=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=2" | grep "\"name\"" |awk -F "\"" '{print $4}' |sed 's/sc\///g'|wc -l`
####### 简单展示
echo "项目$c下有以下镜像仓库:"
for line in $(seq 1 $e)
do
#####具体的仓库名
f=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=$d" | grep "\"name\"" |awk -F "\"" '{print $4}' |sed 's/sc\///g'|awk -v g=$line 'NR==g{print $1}'`
echo $line、$f
done
read -p "请输入序号(1~$e):,查看其下的镜像格式以及对应的数量:" num
if [ $num -ge 1 -a $num -le $e ]
then
#### 镜像仓库名字
h=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories?project_id=$d" | grep "\"name\"" |awk -F "\"" '{print $4}' |sed 's/sc\///g'|awk -v g=$num 'NR==g{print $1}'`
echo "您选择的仓库是$h"
#### 标签类型种类个数
# i=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}' | cut -c -6 |sort -n |uniq|wc -l`
# echo $i
#### 标签类型以及个数
echo "##################################"
echo "镜像格式为:如果是10月,则为201810*"
echo "##################################"
#####每种镜像格式以及其数量
curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}' | cut -c -6 |awk '{count[$1]++}END{for (i in count)print i,count[i]}'
######输入镜像格式,进行删除
echo "如果想删除某种形式的镜像,请输入类型:"
read image_format
##########输入类型的所有镜像
images=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}'|grep $image_format|awk '{print $1}'`
#########统计镜像个数
count_image=`curl -s -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/" |grep "\"name\"" |awk -F"\"" '{print $4}'|grep $image_format|wc -l`
for image_label in $images
do
#############执行删除
curl -u "admin:Harbor12345" -X DELETE -H "Content-Type: application/json" "https://harbor.k8stest.com/api/repositories/$c%2F$h/tags/$image_label"
done
if [ $? -eq 0 ]
then
echo "删除成功"
echo "本次共删除$count_image个镜像"
fi
fi
fi
五 致谢
感谢博客园提供平台,也感谢我的同事帮助我进行测试和验证。
批量删除harbor中的镜像的更多相关文章
- 在Linux主机使用命令行批量删除harbor镜像
在Linux主机使用命令行批量删除harbor镜像 脚本使用说明: 此脚本不是万能脚本,根据自身环境要调整很多 能用harbor的域名就不要用IP 脚本前半部分可以套用,后半部分需一步一步试错,结合 ...
- 如何批量删除Docker中已经停止的容器
如何批量删除Docker中已经停止的容器 方法一: #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID, sudo docker ps -a|grep Exited|awk '{p ...
- SQLServer 命令批量删除数据库中指定表(游标循环删除)
DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ON ...
- SQL触发器批量删除数据库中的表
以下通过触发器批量删除数据库中的表,SQL2008已验证 DECLARE @Table NVARCHAR() DECLARE @Count Int = DECLARE tmpCur CURSOR FO ...
- 批量删除Windows7中隧道适配器的方法
批量删除Windows7中隧道适配器的方法 1.在网卡属性的"网络"中,将"Internet协议版本(TCP/IPv6)"前面的勾去掉. 2.在CMD下分别执行 ...
- Redis中的批量删除数据库中的Key
本文参考:http://blog.csdn.net/spring21st/article/details/15771861 http://stackoverflow.com/questions/575 ...
- 批量删除MSSQL 中主外键约束
转自: http://www.maomao365.com/?p=813 在制作 MSSQL同步工具的时候,发现由于主外键的约束,导致数据同步异常,所有我们需要把 读数据库里面的主外键约束,进行批量删除 ...
- 【转】批量删除redis中的key
1. DEL 直接加键名称 DEL key1 key2 key3 127.0.0.1:6379> DEL site_msg_99973 false site_msg_99974 fals ...
- 批量删除Redis中的key
bin/redis-cli -h 192.168.46.151 -p 6379 keys "rulelist*" | xargs bin/redis-cli -h 192.168 ...
随机推荐
- 搭建hadoop、hdfs环境--ubuntu(完全分布式)
最近在学习hadoop相关知识,就在本机上安装了hadoop,遇到了一些坑,也学到了不少.仅此记录我的安装过程,及可能遇到的问题.供参考.交流沟通见页末. 软件准备 > 虚拟机(VMware) ...
- css——定位
position absolute:绝对定位 1.以页面的左上角为原点 2.不保留原来的位置 3.z-index可以调整图层顺序 如果想实现以父级元素左上角为原点.则:父级相对,子级绝对 在子级绝对的 ...
- input的radio根据value和name反向显示
1.获取radio的值,是根据name设置一组单选框. 例如: <div id="sexBox"> <input type="radio" i ...
- django patch
import datetime import pytz from django.apps import AppConfig from django.db.models.fields import Da ...
- HDU 2048 神、上帝以及老天爷( 错排 )
链接:传送门 思路:错排模板,典型错排问题,n个人所有人都不会抽到自己的方案数为 Dn = (n-1) * (Dn-1 + Dn-2) /******************************* ...
- nysql数据库优化
硬件优化 软件优化 my.cnf参数优化,命令监控show global status\G 调优工具mysqlreport sql语句优化 索引的优化 白名单机制--百度,就是让一些不规范的语句执行查 ...
- JavaScript 实现留言框
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- oracle 的列转行函数 listagg()
当你的表X中有A,B两列,数据如下 A B a 1 a 2 a 3 b 1 b 2 b 3 想让数据以 a|1|2|3 , b|1|2|3 格式显示可使用listagg() 1.使用listagg() ...
- 20121124.Nodejs创建HTTP程序.md
####1.源代码: var http=require('http');//读取http模块 http.createServer(function(req,res){//创建一个服务,接受一个回 ...
- ASP.NET-HTML.Helper常用方法
Html.ActionLink方法 Html.ActionLink("linkText","actionName") Html.ActionLink(" ...