docker - 如何同时根据名称和时间修剪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'
那么在满足两个条件的情况下删除这些图像的最佳方法是:图像名称/标签和年龄。