批量删除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 ...
随机推荐
- 一个helloword hibernate配置以及查询
搭建一个Hibernate环境,开发步骤: 1. 下载源码 版本:hibernate-distribution-3.6.0.Final 2. 引入jar文件 hibernate3.jar核心 + ...
- PHP SOAP如何传入复杂对象
Paymentexpress有一个SOAP服务方法Check3dsEnrollment(String username,String password, EnrolmentCheckRequest t ...
- Android开发进度01
1,今日:目标:完成eclipse中Android sdk和ADT的创建,下载tools工具,创建Android虚拟机 2,昨天:无 3,收获:Android sdk manager需要下载的东西:学 ...
- 移动端优先的flex三栏布局
默认情况下先显示移动端,通过 @media 属性适配屏幕变化 使用flexbox相关的CSS属性 display: flex; (父元素) flex-wrap: nowrap | wrap | wra ...
- 再识Quartz
在之前的项目中使用过Quartz,但都是基于XML配置定义任务的.目前一个项目应用需要对任务进行创建.暂停.删除等动态管理.所以再次在网上翻了翻,再来好好重新认识下Quartz. 名词解释: sche ...
- VUE:项目的创建、编写、打包及规范检查
VUE:项目的创建.编写及打包 项目的创建 使用 vue-cli 创建模板项目(官方提供的脚手架工具) https://github.com/vuejs/vue-cli npm install -g ...
- Java7的那些新特性
本文介绍的java 7新特性很多其它的感觉像是语法糖.毕竟java本身已经比較完好了.不完好的非常多比較难实现或者是依赖于某些底层(比如操作系统)的功能. 不过java7也实现了类似aio的强大功能. ...
- 树莓派学习笔记—— 源码方式安装opencv
0.前言 本文介绍怎样在树莓派中通过编译源码的方式安装opencv,并通过一个简单的样例说明怎样使用opencv. 很多其它内容请參考--[树莓派学习笔记--索引博文] 1.下载若干依 ...
- CentOS进入图形界面
CentOS进入图形界面 学习了: http://www.centoscn.com/CentosBug/osbug/2014/0831/3620.html http://bbs.csdn.net/to ...
- [Python Test] Use pytest fixtures to reduce duplicated code across unit tests
In this lesson, you will learn how to implement pytest fixtures. Many unit tests have the same resou ...