教你如何获取Harbor的带tag的镜像清单_docker

首页 / 新闻资讯 / 正文

最近的工作中,需要批量处理harbor中的一些镜像,其中关键的一步就是获取harbor中全部镜像的带tag的清单。我在网上找了许久,没有找到可用的。

最后我自己写了一个java方法,成功实现了这一需求。

本文测试的harbor的版本是V2.3.3。

下列代码中,使用了一个叫HttpUtils.sendGet的方法。这是我自己实现的一个HTTP请求工具。其代码参见:Java原生HttpClient使用示例

public void getImages(String harborHost, String cookieStr) throws Exception {      HttpResponse<String> catalogResp = HttpUtils.sendGet(harborHost + "/v2/_catalog", cookieStr);      List<String> strings = JSONObject.parseObject(catalogResp.body()).getJSONArray("repositories").toJavaList(String.class);      HashMap<String, List<String>> result = new HashMap<>();      for (String image : strings) {          ArrayList<String> tagList = new ArrayList<>();          String[] split = image.split("/");          String repositoryName = split[0];          String imageName = split[1];          String urlForImageInfo = harborHost + "/api/v2.0/projects/" + repositoryName + "/repositories/" + imageName;          HttpResponse<String> infoResp = HttpUtils.sendGet(urlForImageInfo, cookieStr);          Integer artifactCount = JSONObject.parseObject(infoResp.body()).getInteger("artifact_count");          int pageNum = artifactCount / 15;          pageNum = pageNum * 15 >= artifactCount ? pageNum : pageNum + 1;          for (int i = 1; i <= pageNum; i++) {              String urlForTags = urlForImageInfo + "/artifacts?with_tag=true&with_scan_overview=true&with_label=true&page_size=15&page=" + i;              HttpResponse<String> tagsResp = HttpUtils.sendGet(urlForTags, cookieStr);              JSONArray tagArray = JSONObject.parseArray(tagsResp.body());              for (int j = 0; j < tagArray.size(); j++) {                  String tagsStr = tagArray.getJSONObject(j).getString("tags");                  if (!StrUtils.isEmpty(tagsStr)) {                      JSONArray tags = tagArray.getJSONObject(j).getJSONArray("tags");                      for (int k = 0; k < tags.size(); k++) {                          tagList.add(tags.getJSONObject(k).getString("name"));                      }                  }              }          }          result.put(image, tagList);      }      for (String key : result.keySet()) {          for (String t : result.get(key)) {              System.out.println(key + ":" + t);          }      }  }  

此方法需要传入两个参数。第一个是:harborHost为harbor的URL的字符串,比如:https://harbor.wja.cn
第二个也是一个字符串,需要手动登录harbor页面,在首页中,按F12,弹出开发工具,然后刷新页面,第一个请求的cookie的值就所需的字符串,如下图所示:

测试结果如下: