首页 > 解决方案 > 如何同时根据名称和时间修剪docker镜像

问题描述

背景

我有构建机器,它每天创建 docker 容器图像并将其上传到 Azure。有一段时间没有问题,直到构建机器的磁盘空间不足。

所以我的想法是修剪我项目的所有旧图像并保持其他图像完好无损(已经推送到 Azure)。还有其他旧图像,但名称(标签)不同,不应删除。

我不想在成功推送到 Azure 后立即删除图像(这是最小计划)。

问题

我找到了如何删除图像的解决方案

$ docker rmi test1:latest
# or more complex wher I hoped other filers would work
$ docker rmi $(docker image ls --format '{{.Repository}}:{{.Tag}}' --filter="test1:*")
$ docker image prune -a --force --filter "until=240h"

但是将这两个标准合并在一起有问题(多个--filter参数应该作为and)。

最烦人的 docker API 是不一致的。每个 docker 命令都有自己的选项参数列表--filter。的文档--filter="lable=<key>=<value>也很敷衍。

这是一些显示这种不一致的演示:

$ docker image ls --format '{{.Repository}}:{{.Tag}}' --filter="reference=test1:*" --filter="until=20h"
Error response from daemon: Invalid filter 'until'

$ docker image prune --filter="until=2200h" 'test1:latest' -a -f
"docker image prune" accepts no arguments.
See 'docker image prune --help'.

Usage:  docker image prune [OPTIONS]

Remove unused images

$ docker image prune --filter="reference=eei-linux-devel-image:old" --filter="until=200h" -a -f
Error response from daemon: Invalid filter 'reference'

那么在满足两个条件的情况下删除这些图像的最佳方法是:图像名称/标签和年龄。

标签: docker

解决方案


推荐阅读