0

我正在使用 DockerClient 并且我有一个图像集合,我需要删除所有这些,但不是最新的,所以我想按升序对集合进行排序,我有一个创建的字段,它是一个字符串日期的数字表示为 1632912516。

我尝试了下一个:

    public void checkingTest() throws DockerException, InterruptedException {
      try {
      List<com.spotify.docker.client.messages.Image> sortedImages = getImages();

      sortedImages.stream()
          .filter(img -> !img.id().equals(sortedImages.get(sortedImages.size() - 1).id()))
          .forEach(img -> {
            try {
              dockerClient.removeImage(img.id());
            }
            catch (DockerException e) {
              e.printStackTrace();
            }
            catch (InterruptedException e) {
              e.printStackTrace();
            }
          });
    }
    catch (DockerCertificateException e) {
      e.printStackTrace();
    }
  }

  private List<com.spotify.docker.client.messages.Image> getImages()
      throws DockerCertificateException, DockerException, InterruptedException
  {
    final DockerClient dockerClient =
        DefaultDockerClient.fromEnv().connectTimeoutMillis(TimeUnit.SECONDS.toMillis(3)).build();

    return dockerClient.listImages()
        .stream()
        .filter(image -> image.labels() != null && image.labels().containsKey("image"))
        .sorted((o1, o2) -> o2.created().compareTo(o1.created()))
        .collect(
            Collectors.toList());
  }

但是我看到,在getImages方法中集合没有排序,所以我认为我需要将创建的字段转换为不同的字符串来实现这一点。

有任何想法吗?

4

3 回答 3

0

sorted()接受 a Comparator,其单一抽象方法compare()Comparable's相对compareTo()

如果listImages实现返回任何类,Comparable那么您可以sorted()不带参数使用,正如compareTo()将调用的那样。但是, Override of compareTo()will 需要将您正在考虑的任何字段与“最后一个”进行比较(这是按日期吗?按名称?)。

如果您想按时间顺序对信息进行排序,我还建议String您使用(或类似的东西),而不是创建并使用它作为日期的数字表示。LocalDateTime取决于排序实现Strings,因为数字不会与真实数字(1、10、100、2、20、200)排序相同。从抽象的角度来看,将日期视为日期。

于 2021-09-29T17:20:17.940 回答
0

您可以按创建日期降序对事物进行排序,跳过第一个(最新)并为每个剩余图像进行删除:

try{
final DockerClient dockerClient = DefaultDockerClient.fromEnv()
.connectTimeoutMillis(TimeUnit.SECONDS.toMillis(3)).build();
    dockerClient.listImages()
            .stream()
            .filter(image -> image.labels() != null && image.labels().containsKey("image"))
            .sorted(Comparator.comparing(Image::created).reversed()).skip(1)
            .forEach(img -> {
            try {
              dockerClient.removeImage(img.id());
            catch(Exception ex){
              ex.printStackTrace();
            }
            );
}catch (Exception e){
   e.printStackTrace();
}

      
于 2021-09-29T19:11:25.693 回答
0

集合.max()

您无需对所有图像进行排序即可找到最新的。Collections.max()可以做到这一点。简化代码来说明我的观点:

    List<Image> unsortedImages = // …;
    if (! unsortedImages.isEmpty()) {
        Id latestId = Collections.max(unsortedImages,
                        Comparator.comparingLong(img -> Long.parseLong(img.created())))
               .id();
         // Proceed with deleting as in your code
    }

我知道这会Image.created()返回一个String持有 Unix 时间戳(自 1970 年 Unix 纪元以来的秒数)。

于 2021-09-29T19:24:27.963 回答