一 说明python
这个是我第一篇博客,因此我想放上原创的东西,尽管我一直都很担忧本身写得太low,可是总要学会尝试,学会改变本身,相信本身。在写这个脚本时,因为我接触LInux不是不少,能力有限,仅仅是为了让本身心情好点,能够说只是为了完成任务,并无考虑其中好比代码重复,注释不完整等诸多问题。这是9月份作的事情了,由于各类缘由,后续也没去关注脚本中问题。请多多包含。git
二 背景github
公司最近在搞关于k8s的东西,我也跟着参与进去了。在学习和使用了一段时间以后,发现Habor中的镜像愈来愈多,由于咱们是采用以当前时间做为镜像的标签,因此几个月以后,发现磁盘容量剩余很少了,决定要删除以前的一些已经肯定不会再使用的镜像。因而,我就手动删除了最先一个月的镜像,结果搞得我很不爽,这样子太慢了,太消耗时间了。因而想,经过脚本删除岂不是更好么?这样子很快的就可以删除那些没用的镜像了,免得我心烦。后来网上找了一下,发现并无相似的脚本之类的。因而,决定根据官网所提供的接口本身来写一个脚本。当时在了解了以后,决定用shell,python也是能够的 ,不过我还在学习的路上。因此决定先用shell,后学学成再改到用python。在此过程当中,很是感谢个人一个同事陪我一块儿进行了测试和验证。docker
三 具体思路shell
首先,咱们的harbor中的项目都是公有的,harbor的访问时经过域名,采用https,镜像以当前时间为标签,好比201810121420 201807081234。执行删除脚本时,先告诉你目前harbor下有那些项目,让你选择项目,根据你选择的项目去查询它下面有哪些仓库,让你输入仓库,再去查询其下面有哪几种镜像格式,如10月的镜像格式为201810;再根据你输入的镜像格式去删除以镜像格式删除的镜像,就是若是你选择201810,则2018年10月的全部镜像都会被删除,最后告知你删除了多少个镜像。脚本执行后,磁盘空间并不会释放,仍是须要中止Harbor进行回收。json
四 脚本内容api
脚本我放在了github上,地址:https://github.com/zhouhua-amei/dockerbash
#! /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
五 致谢app
感谢博客园提供平台,也感谢个人同事帮助我进行测试和验证。curl