shell中获取Harbor中所有的镜像列表(超实用,建议收藏)
Posted 键客李大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中获取Harbor中所有的镜像列表(超实用,建议收藏)相关的知识,希望对你有一定的参考价值。
前言
我们要查询Harbor中某个项目下某个镜像是否存在,需要登录Harbor UI管理界面,然后进入到项目(Project),再到搜索框输入镜像的名称来查找镜像在不在。
那么,如果只知道镜像的名称,不知道镜像在哪个项目(Project)呢?你是每个项目下都去搜索么?
那么!有什么方法可以简化这些操作呢?即:
- 不需要登录Harbor就可以看到Harbor里面所有的镜像;
- 仅提供镜像名称就可以看到镜像在哪个项目;
- 仅知道镜像名称就可以判断Harbor镜像仓库中是否存在这个镜像,从而判断上传的镜像是否上传成功。
我在工作中常遇到开发的同事的问题:
- 我上传一个镜像,帮忙看上传成功没?
- 我刚发布一个服务,构建的时候报错一直找不到镜像,这是什么原因?
- 我之前上传好几个版本的镜像,怎么知道都有哪些?
解决方案
刚才描述了我在维护Harbor中遇到的一些业务问题,那有什么方法来优化这些问题呢?来减轻我的维护难度。
Harbor提供了良好的API支持,我何不利用这一点,通过调用API来获取Harbor中所有项目下(Project)所有的镜像,以及该镜像下所有的版本,生成一个镜像清单,再将该清单放到一个文件中,查看的时候仅需要grep命令过滤下就根据镜像名称来查到我想要的信息呢?
具体实现
因为Harbor有两个版本的API,即1.0版本和2.0版本,不同的API调用方法存在一定的区别。
本处我就以shell脚本的方式来实现,Python和Go版本的可自行参考。
1版本APIshell脚本实现
适用于Harbor v2.0以下的版本。
1)编写shell脚本
[root@Harbor_backup]# vim Harbor-image-list-100.sh
#!/bin/bash
#镜像清单文件,将获取到的镜像信息存到该文件中
File=harbor-images-`date +%Y-%m-%d`.txt
## 定义Harbor连接地址,这里需要改为你们自己的Harbor地址
Address=http://192.168.2.250:443
## 定义连接Harbor的用户名和密码(因为是获取全部的镜像,只有admin用户才有该权限)
Hamin=admin:Harbor12345
## 获取Harbor中有哪些项目(Project)
Project_List=$(curl -u "$Hamin" -X GET $Address/api/projects -H "Content-Type: application/json" | grep name | awk /"name": / | awk -F " print $4)
for Project in $Project_List;do
# 循环获取每个项目下所有的镜像
Image_Names=$(curl -u "$Hamin" -X GET $Address/api/search?q=$Project -H "Content-Type: application/json" | grep "repository_name" | awk -F "\\"" print $4)
for Image in $Image_Names;do
# 循环获取每个镜像所有的标签(版本)
Image_Tags=$(curl -u "$Hamin" -X GET $Address/api/repositories/$Image/tags -H "Content-Type: application/json" | awk /"name": / | awk -F " print $4)
for Tag in $Image_Tags;do
# 将获取到的镜像完整路径存档到镜像清单文件
echo "$Address/$Image:$Tag" | grep -v Base | grep -v Image | grep -v CentOS >> $File
done
done
done
2)执行脚本
[root@harbor-conso ~]# chmod +x Harbor-image-listk-100.sh
[root@harbor-conso ~]# sh Harbor-image-list-100.sh
...
先让子弹飞会儿,等一哈哈!
3)清单文件查看镜像
[root@harbor-conso ~]# cat harbor-images-2022-04-18.txt c| tail -10
http://192.168.2.250:443/lihonggang-25655/eeeee:rrrrr-20211207201732
http://192.168.2.250:443/lihonggang-25655/wwww:aaaa-20211207202110
http://192.168.2.250:443/lihonggang-25655/wwww:aaaa-20211207202855
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.5-20220414154335
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.5
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.3-20220412182511
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.3
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.3-20220407184829
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.5-20220412183221
http://192.168.2.250:443/wxgtest-25688/app-wxgtest:v1.0-wxg-20211207193353
API v2版本的Shell脚本实现
在shell脚本中通过调用Harbor API获取Harbor中所有项目下的所有镜像,然后导出到文本中。
本脚本按API V2版本的调用方式编写(2.0版本以下不适用),可通过以下命令查看你使用的Harbor API版本。
[root@harbor-conso ~]# curl https://192.168.2.250:443/api/version -k
"version":"v2.0"
编写脚本
[root@harbor-conso ~]# Harbor-image-listk-v2.sh
#!/bin/bash
Harbor_Address=192.168.2.250:443 #Harbor主机地址
Harbor_User=admin #登录Harbor的用户
Harbor_Passwd=Harbor12345 #登录Harbor的用户密码
Images_File=harbor-images-`date +%Y-%m-%d`.txt # 镜像清单文件 #镜像清单文件
Tar_File=/backup/Harbor-backup/ #镜像tar包存放路径
set -x
# 获取Harbor中所有的项目(Projects)
Project_List=$(curl -u admin:Harbor12345 -H "Content-Type: application/json" -X GET https://192.168.2.250:443/api/v2.0/projects -k | python -m json.tool | grep name | awk /"name": / | awk -F " print $4)
for Project in $Project_List;do
# 循环获取项目下所有的镜像
Image_Names=$(curl -u admin:Harbor12345 -H "Content-Type: application/json" -X GET https://192.168.2.250:443/api/v2.0/projects/$Project/repositories -k | python -m json.tool | grep name | awk /"name": / | awk -F " print $4)
for Image in $Image_Names;do
# 循环获取镜像的版本(tag)
Image_Tags=$(curl -u admin:Harbor12345 -H "Content-Type: application/json" -X GET https://192.168.2.250:443/v2/$Image/tags/list -k | awk -F " print $8,$10,$12)
for Tag in $Image_Tags;do
# 格式化输出镜像信息
echo "$Harbor_Address/$Image:$Tag" >> harbor-images-`date +%Y-%m-%d`.txt
done
done
done
执行脚本
[root@harbor-conso ~]# chmod +x Harbor-image-listk-v2.sh
[root@harbor-conso ~]# sh Harbor-image-listk-v2.sh
从镜像清单查找镜像
然后打开脚本所在目录的harbor-images-`date +%Y-%m-%d`.txt文件即可看到镜像清单了。
[root@harbor-conso ~]# cat harbor-images-2022-04-18.txt c| tail -10
http://192.168.2.250:443/lihonggang-25655/eeeee:rrrrr-20211207201732
http://192.168.2.250:443/lihonggang-25655/wwww:aaaa-20211207202110
http://192.168.2.250:443/lihonggang-25655/wwww:aaaa-20211207202855
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.5-20220414154335
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.5
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.3-20220412182511
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.3
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.3-20220407184829
http://192.168.2.250:443/gx-eop-es-30254/gx-eop-es:meng-v1.0.5-20220412183221
http://192.168.2.250:443/wxgtest-25688/app-wxgtest:v1.0-wxg-20211207193353
以上是关于shell中获取Harbor中所有的镜像列表(超实用,建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章