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

Posted 键客李大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实用小技能:一键获取Harbor中镜像信息,快捷查询镜像相关的知识,希望对你有一定的参考价值。

前言


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

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

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

  • 不需要登录Harbor就可以看到Harbor里面所有的镜像;
  • 仅提供镜像名称就可以看到镜像在哪个项目;
  • 仅知道镜像名称就可以判断Harbor镜像仓库中是否存在这个镜像,从而判断上传的镜像是否上传成功。

我在工作中常遇到开发的同事的问题:

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

命令行获取Harbor镜像清单

在Harbor服务主机上,可通过如下命令在 registry 存储目录下获取镜像列表:

$ grep data_volume  /app/harbor/harbor.yml    #根据配置文件查找数据存储目录
data_volume: /data

$ cd /data/registry    #进入到Harbor的数据目录下
$ find  docker  -type  d  -name "current"  | sed  s|docker/registry/v2/repositories/||g;s|/_manifests/tags/|:|g;s|/current||g  >  images.list
$ cat images.list
lidabai/busybox:1.28
library/prepare:v2.5.1

Shell脚本获取Harbor中所有的镜像列表

通过调用Harbor API,先获取所有项目(Projects),然后循环获取每个项目下的镜像名称,再循环获取某个镜像的所有tag版本,最后以指定的格式输出到一个镜像清单文件中。
而Harbor的API有两个版本(v1、v2), 每个版本的API调用方法都不一样。


3.1 查看API版本

$ curl https://192.168.2.250:443/api/version  -k
"version":"v2.0"

3.2 Harbor V1 API的shell脚本

$ cat Harbor-image-list.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
$ chmod +x   Harbor-image-listk.sh       #给脚本可执行权限
$ sh Harbor-image-listk.sh    #执行脚本

然后可以打开$File中的文件查看镜像清单了!

3.3 Harbor API v2版本的Shell脚本实现

$ cat  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
$ chmod +x Harbor-image-listk-v2.sh
$ sh Harbor-image-listk-v2.sh

基于镜像清单将Harbor中的镜像制作成tar包

4.1 编写shell脚本

$ cat image-pull.sh
#!/bin/bash
###使用docker从镜像文件中下载镜像——将下载的镜像进行打包保存——删除下载到本地的镜像——将封装好的镜像包移动到备份目录
Image_tags=$(uniq $Images_File)
for image_tag in $Image_tags;do
    image_Name=$(echo $image_tag | awk -F/ print $3 |  awk -F: print $1)
    image_Lable=$(echo $image_tag | awk -F/ print $3 |  awk -F: print $2)
    docker pull $image_tag
    docker save $image_tag  -o $image_Name-$image_Lable.tar
    docker rmi  $image_tag
    mv $image_Name-$image_Lable.tar  $Tar_File
done
$ chmod +x  image-pull.sh

【原创声明】
本文为作者原创,正逐个迁移至微信公众号《Harbor进阶实战》。

以上是关于实用小技能:一键获取Harbor中镜像信息,快捷查询镜像的主要内容,如果未能解决你的问题,请参考以下文章

「开源摘星计划」Containerd拉取Harbor中的私有镜像,云原生进阶必备技能

云原生时代必须具备的核心技能之Docker高级篇(Harbor-镜像私服)

100个 Unity实用技能☀️ | Unity 通过自定义菜单将资源一键导出

Harbor一键部署——初学者如何快速了解它?

小松教你手游开发unity实用技能unity发包优化(android一键发包)

离线手动部署docker镜像仓库——harbor仓库