#环境说明: 这里使用的harbor版本是2.0.2
- Harbor API 相关的接口可以在Harbor首页左下方看到下图红框所示的位置点击查看
1. 列出镜像名字使用的API如下图
- 输入需要查询的项目下仓库信息,先点击 Try it out填写信息, 然后点击 Execute生产url地址
- 使用生成的url来列出镜像
# harbor api地址
harbor_url="https://$HOST/api/v2.0"
# 列出项目中仓库的镜像
# project_name 项目名
# repository_name 仓库名
${harbor_url}/projects/{project_name}/repositories/{repository_name}/artifacts #GET方法获取镜像
# 此时的page在web UI上第一页显示的数量是10个,可以修改page_size的值为你的镜像总条数(例如1000)
curl -X GET "https://192.168.1.229/api/v2.0/projects/$project/repositories/$name/artifacts?page=1&page_size=10&with_tag=true&with_label=false&with_scan_overview=false&with_signature=false&with_immutable_status=false"
# 修改后
curl -X GET "https://192.168.1.229/api/v2.0/projects/$project/repositories/$name/artifacts?page=1&page_size=1000&with_tag=true&with_label=false&with_scan_overview=false&with_signature=false&with_immutable_status=false"
列出仓库中的所有镜像后可以使用jq工具处理json格式 然后使用grep和awk取得镜像的digest的值
# 像这样就可以取得仓库中所有的镜像号了,然后再进行下一步
curl -X GET "https://192.168.1.229/api/v2.0/projects/$project/repositories/$name/artifacts?page=1&page_size=1000&with_tag=true&with_label=false&with_scan_overview=false&with_signature=false&with_immutable_status=false" | jq . | grep "digest" | awk -F '"' '{print $4}' > /tmp/digest.txt
2. 删除镜像使用的API如下图
# 根据镜像的distge删除镜像
/projects/{project_name}/repositories/{repository_name}/artifacts/{reference}
# 同上方式获取到url地址后就可以删除了
curl -k -u "admin:Harbor12345" -X DELETE "https://$HOST/api/v2.0/projects/project/repositories/name/artifacts/${digest}"
最后附上一个脚本文件
#!/bin/bash
#获取镜像号列表
curl -X GET "https://$HOST/api/v2.0/projects/$project/repositories/$name/artifacts?page=1&page_size=1000&with_tag=true&with_label=false&with_scan_overview=false&with_signature=false&with_immutable_status=false" | jq . |grep "digest" | awk -F '"' '{print $4}' > /tmp/digest.txt
#设定需要保留的镜像号
TOTAL_NUN=$(cat /tmp/digest.txt |wc -l )
DELETE_NUN=$( echo "${TOTAL_NUN} - 50 "|bc )
DELETE_IMAGES=$(tail -n ${DELETE_NUN} /tmp/digest.txt )
#开始删除
for DIGEST in ${DELETE_IMAGES}
do
curl -u "admin:Harbor12345" -X DELETE "https://$HOST/api/v2.0/projects/project/repositories/name/artifacts/${DIGEST}"
done
#如果想要并行执行, 将循环体放在{}里面即可, 不过可能会造成harbor出现504报错.
#若果有多个仓库需要删除,可以在外层再执行一个循环