当前位置:网站首页>Practical skills: a key for image information in the Harbor, quick query image

Practical skills: a key for image information in the Harbor, quick query image

2022-08-09 09:40:00 51CTO

Practical skills:一键获取HarborMedium mirror information,Quick query mirror_harbor

【摘要】
一键获取Harbor中的镜像列表,无需登录harbor UI,You can also download images in batches to the local and save them as tar包.
本文已参与「开源摘星计划」,欢迎正在阅读的你加入.
活动链接: https://github.com/weopenprojects/WeOpen-Star

前言


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

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

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

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

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

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

命令行获取Harbor镜像清单

在Harboron the service host,可通过如下命令在 registry Get a list of mirrors in the storage directory:

$ grep data_volume  /app/harbor/harbor.yml    #Find the data storage directory based on the configuration file
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

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

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

前面在harborThe service host command line is implementedharborGet the mirror list list.
那么,如果不是在HarborHow to get it on the service host?

通过调用Harbor API,Get all items first(Projects),Then loop to get the mirror names under each project,Recycle to get all of an imagetag版本,Finally output to an image manifest file in the specified format.
而Harbor的API有两个版本(v1、v2), 每个版本的APICalling methods are different.


3.1 查看API版本

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

     
  • 1.
  • 2.

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    #执行脚本

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

然后可以打开$FileSee the mirror list for the files in !

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

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

Based on the mirror list will beHarborThe mirror image in is madetar包

前面通过shell脚本获取harbor中的镜像列表,并以
harbor地址:服务端口/项目名称/镜像名称:tagformat is output to a file.
Then you can batch according to this filepull镜像到本地,然后制作成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

     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

【原创声明】
本文为作者原创,It is being migrated to the WeChat public account one by one《Harbor进阶实战》.

原网站

版权声明
本文为[51CTO]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/221/202208090932300305.html