shell中获取Harbor中所有的镜像列表(超实用,建议收藏)

少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述shell中获取Harbor中所有的镜像列表(超实用,建议收藏)相关的知识,希望能为你提供帮助。


前言我们要查询Harbor中某个项目下某个镜像是否存在,需要登录Harbor UI管理界面,然后进入到项目(Project),再到搜索框输入镜像的名称来查找镜像在不在。
那么,如果只知道镜像的名称,不知道镜像在哪个项目(Project)呢?你是每个项目下都去搜索么?
那么!有什么方法可以简化这些操作呢?即:

  • 不需要登录Harbor就可以看到Harbor里面所有的镜像;
  • 仅提供镜像名称就可以看到镜像在哪个项目;
  • 仅知道镜像名称就可以判断Harbor镜像仓库中是否存在这个镜像,从而判断上传的镜像是否上传成功。
我在工作中常遇到开发的同事的问题:
  • 我上传一个镜像,帮忙看上传成功没?
  • 我刚发布一个服务,构建的时候报错一直找不到镜像,这是什么原因?
  • 我之前上传好几个版本的镜像,怎么知道都有哪些?


解决方案【shell中获取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]# vimHarbor-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 +xHarbor-image-listk-100.sh
[root@harbor-conso~]# shHarbor-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 GEThttps://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 GEThttps://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+xHarbor-image-listk-v2.sh
[root@harbor-conso~]# shHarbor-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










    推荐阅读