如何获取 Harbor 中所有镜像 tag 标签

网友投稿 456 2022-10-17

如何获取 Harbor 中所有镜像 tag 标签

整理缘由

也曾参考网上的文章,但脚本写的基本没有上来就能顺利执行的,而且也没有考虑 Harbor API 中给的默认 page_size = 10 ,当仓库数量或者镜像数量超过 10 个,都无法取全,所以花时间整理了一下 shell 脚本,并用 go 进行重写了一个命令,两个脚本都是可以正常执行,go 的执行时间会比 shell 的快一点,按需自取即可。

shell 脚本获取 harbor 镜像标签

#!/bin/bashHarbor_Schema=" # Harbor 登录协议,可选 or #Harbor主机地址Harbor_User="admin" #登录Harbor的用户Harbor_Passwd=123456 #登录Harbor的用户密码Images_File=harbor-images-`date '+%Y-%m-%d'`.txt # 镜像清单文件# 检测是否含有 yq 命令function check_yq() { which yq SINGLE=$? if [[ $SINGLE -ne 0 ]] ; then echo -e "本脚本强依赖 yq 命令,脚本会自动下载 yq 安装,如果不能联网,请手动至\n \n进行下载, 并上传至系统 PATH 路径下" wget -O /usr/bin/yq &&\ chmod +x /usr/bin/yq check_yq else echo "yq 命令已安装,正在检测 Harbor 状态..." fi}check_yqecho -e "正在将内容输出至 $Images_File 文件中,请稍等..."# 获取Harbor中所有的项目(Projects)Project_List=$(curl -u ${Harbor_User}:${Harbor_Passwd} -H "Content-Type: application/json" -X GET "${Harbor_Schema}://${Harbor_Address}/api/v2.0/projects?page_size=100" -k -s | yq '.[].name' -)for Project in $Project_List;do # 循环获取项目下所有的镜像 Image_Names=$(curl -u ${Harbor_User}:${Harbor_Passwd} -H "Content-Type: application/json" -X GET "${Harbor_Schema}://${Harbor_Address}/api/v2.0/projects/$Project/repositories?page_size=100" -k -s | yq '.[].name' -) for Image in $Image_Names;do # 循环获取镜像的版本(tag) Image_Tags=$(curl -u ${Harbor_User}:${Harbor_Passwd} -H "Content-Type: application/json" -X GET ${Harbor_Schema}://${Harbor_Address}/v2/$Image/tags/list -k -s | yq '.tags' | awk -F "[" '{print $2}' | awk -F "]" '{print $1}' | sed 's/\,//g') for Tag in $Image_Tags;do # 格式化输出镜像信息 echo "$Harbor_Address/$Image:$Tag" >> harbor-images-`date '+%Y-%m-%d'`.txt done donedoneecho -e "输出完成,请查看 $Images_File 文件"

执行结果脱敏示例:

***@***MacBook-Pro Desktop % cat harbor-images-2022-08-17.txtharbor.k8s.local/harbor/clickhouse:"22.3.3.44"harbor.k8s.local/harbor/nginx:"20220719084929-3-main"harbor.k8s.local/harbor/nginx:"20220719113621-1-main"harbor.k8s.local/harbor/nginx:"20220727185042-2-main"harbor.k8s.local/harbor/nginx:"20220727185218-4-main"

通过 GO 获取 harbor 镜像标签

与 shell 脚本唯一的区别就是增加了仓库的选项,shell 默认获取全部仓库,go 重写的可以支持只获取指定仓库的所有镜像的标签,对于有发版独立仓库的来说会比较友好一点。

使用方式

go run harbor.go -h -passwd string harbor password, default 123456 (default "123456") -repositry string 指定要选中的仓库,默认为 all,全部仓库 (default "all") -schema string or (default " -url string harbor Address,deault harbor.k8s.local (default "harbor.k8s.local") -user string harbor admin, default admin (default "admin")

go run harbor.go --schema --url harbor.k8s.local --user admin --passwd 123456 --repositry all

package mainimport ( "encoding/json" "flag" "fmt" "github.com/bitly/go-simplejson" "io/ioutil" "log" "net/ "net/url" "os")// harbor 信息type Infomation struct { Schema string URL string User string Pass string}// 镜像 tagtype ImageTag struct { Name string `json:"name"` Tags []string `json:"tags"`}// 获取 harbor 仓库的信息,返回列表func (i *Infomation) HarborProject() ([]string, error) { var rr []map[string]interface{} u := i.Schema + "://" + i.URL + "/api/v2.0/projects" req, err := u, nil) if err != nil { panic(err) } params := make(url.Values) params.Set("page_size", "100") req.URL.RawQuery = params.Encode() req.SetBasicAuth(i.User, i.Pass) r, err := body, err := ioutil.ReadAll(r.Body) json.Unmarshal(body, &rr) arrayHarbor := make([]string, 0) for _, v := range rr { b, _ := json.Marshal(v) mapStr, err := simplejson.NewJson(b) if err != nil { panic(err) } pro_1, _ := mapStr.Get("name").String() arrayHarbor = append(arrayHarbor, pro_1) if err != nil { panic(err) } } return arrayHarbor, err}// 根据提供的 harbor 仓库的信息,获取仓库中的镜像信息列表func (i *Infomation) HarborImage(project []string) ([]string, error) { arrayimage := make([]string, 0) var err error for _, v := range project { u := i.Schema + "://" + i.URL + "/api/v2.0/projects/" + v + "/repositories" req, err := u, nil) if err != nil { panic(err) } params := make(url.Values) params.Set("page_size", "100") req.URL.RawQuery = params.Encode() req.SetBasicAuth(i.User, i.Pass) r, err := body, err := ioutil.ReadAll(r.Body) var rr []map[string]interface{} json.Unmarshal(body, &rr) for _, v := range rr { b, _ := json.Marshal(v) mapStr, err := simplejson.NewJson(b) if err != nil { panic(err) } ime, err := mapStr.Get("name").String() if err != nil { panic(err) } arrayimage = append(arrayimage, ime) } } return arrayimage, err}// 根据镜像信息,找到镜像中的 tag ,并写入至提供的 file 中func (i *Infomation) HarborTag(ime []string, fileName string) error { var err error var imageTag ImageTag //dstFile, err :=os.OpenFile(fileName, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) dstFile, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { panic(err) } defer dstFile.Close() log.Println("正在输出 harbor image tag 信息!!!\n") for _, v := range ime { u := i.Schema + "://" + i.URL + "/v2/" + v + "/tags/list" req, err := u, nil) if err != nil { panic(err) } params := make(url.Values) params.Set("page_size", "100") req.URL.RawQuery = params.Encode() req.SetBasicAuth(i.User, i.Pass) r, err := body, err := ioutil.ReadAll(r.Body) json.Unmarshal(body, &imageTag) for _, t := range imageTag.Tags { tag := i.URL + "/" + imageTag.Name + ":" + t fmt.Println(tag) dstFile.WriteString(tag + "\n") } } fmt.Println("") log.Printf("harbor image 信息输出至 %v 文件中,注意每次执行命令会覆盖之前的结果!!!", fileName) //return arraytag, err return err}// harbor cmd 的参数信息func (i *Infomation) HarborCmd(f string) { var repositry string flag.StringVar(&i.Schema, "schema", ""or flag.StringVar(&i.URL, "url", "harbor.k8s.local", "harbor Address,deault harbor.k8s.local") flag.StringVar(&i.User, "user", "admin", "harbor admin, default admin") flag.StringVar(&i.Pass, "passwd", "123456", "harbor password, default 123456") flag.StringVar(&repositry, "repositry", "all", "指定要选中的仓库,默认为 all,全部仓库") flag.Parse() if flag.NFlag() == 0 { log.Fatal("此命令必须传入参数, 否则无法执行\n -passwd string\n harbor password, default 123456 (default \"123456\")\n -repositry string\n 指定要选中的仓库,默认为 all,全部仓库 (default \"all\")\n or (default \" -url string\n harbor Address,deault harbor.k8s.local (default \"harbor.k8s.local\")\n -user string\n harbor admin, default admin (default \"admin\")\n\n示例:run harbor.go --schema --url harbor.k8s.local --user admin --passwd 123456 --repositry all\n") } if repositry == "all" { project, err := i.HarborProject() if err != nil { panic(err) } imagelist, err := i.HarborImage(project) if err != nil { panic(err) } i.HarborTag(imagelist, f) } else { imagelist, err := i.HarborImage([]string{repositry}) if err != nil { panic(err) } i.HarborTag(imagelist, f) }}func main() { var i Infomation fileName := "./harborImageList.txt" i.HarborCmd(fileName)}

示例执行脱敏结果:

***@***MacBook-Pro Desktop % cat harborImageList.txt harbor.k8s.local/harbor/clickhouse:22.3.3.44harbor.k8s.local/harbor/nginx:20220719084929-3-mainharbor.k8s.local/harbor/nginx:20220719113621-1-mainharbor.k8s.local/harbor/nginx:20220727185042-2-mainharbor.k8s.local/harbor/nginx:20220727185218-4-main

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Netty组件NioEventLoopGroup创建线程执行器源码解析
下一篇:Docker 架构演进
相关文章

 发表评论

暂时没有评论,来抢沙发吧~