「开源摘星计划」shell中获取Harbor中所有的镜像列表(超实用,建议收藏)

762 阅读3分钟

本文已参与「开源摘星计划」,欢迎正在阅读的你加入。
活动链接:github.com/weopenproje…


前言

我们要查询Harbor中某个项目下某个镜像是否存在,需要登录Harbor UI管理界面,然后进入到项目(Project),再到搜索框输入镜像的名称来查找镜像在不在。

那么,如果只知道镜像的名称,不知道镜像在哪个项目(Project)呢?你是每个项目下都去搜索么?

那么!有什么方法可以简化这些操作呢?即:

不需要登录Harbor就可以看到Harbor里面所有的镜像; 仅提供镜像名称就可以看到镜像在哪个项目; 仅知道镜像名称就可以判断Harbor镜像仓库中是否存在这个镜像,从而判断上传的镜像是否上传成功。 我在工作中常遇到开发的同事的问题:

我上传一个镜像,帮忙看上传成功没? 我刚发布一个服务,构建的时候报错一直找不到镜像,这是什么原因? 我之前上传好几个版本的镜像,怎么知道都有哪些?

解决方案

刚才描述了我在维护Harbor中遇到的一些业务问题,那有什么方法来优化这些问题呢?来减轻我的维护难度。

Harbor提供了良好的API支持,我何不利用这一点,通过调用API来获取Harbor中所有项目下(Project)所有的镜像,以及该镜像下所有的版本,生成一个镜像清单,再将该清单放到一个文件中,查看的时候仅需要grep命令过滤下就根据镜像名称来查到我想要的信息呢?

版本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

image.png

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文件即可看到镜像清单了。