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

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

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

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


从镜像清单查找镜像

然后打开脚本所在目录的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中所有的镜像列表(超实用,建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章

实用小技能:一键获取Harbor中镜像信息,快捷查询镜像

Harbor1.5.2批量清理无效镜像

向harbor推送镜像时报unauthorizedauthorization required

安装harbor私有镜像仓库

Harbor1.5.0仓库使用教程

利用 Harbor 搭建企业级私有镜像仓库(文末赠书)