我有一个简单的CI系统。

我将在一个示例中详细解释我的工作和要删除的内容。

我将d_api项目上传到AWS ECR存储库secret.dkr.ecr.eu-central-1.amazonaws.com/d_api,始终使用不同的标签匹配git commit

我将这些image从CI机器构建并将其推向AWS ECR。

成功推动image的那一刻,我想为此项目删除先前的imageBUT KEEP THE LAST 2(包括我刚推动的一个image,总共3个)。

到目前为止,我尝试了什么?

我可以像这样过滤image

docker image ls --filter 'reference=secret.dkr.ecr.eu-central-1.amazonaws.com/d_api*'

结果将显示此特定项目的所有image。

我想删除除最后3个。

为此,我正在尝试使用docker image prune命令,但似乎找不到正确的过滤器。

我可以使用time-based过滤器Fine docker image prune -af --filter "until=720h",但在我的情况下不需要它们。我想删除最后3个。

有可能吗?

如果不可能,我如何修改时间过滤器并删除"all images of api repository older than 30 days"。

我相信这样做应该有效

docker image prune -af --filter "reference=secret.dkr.ecr.eu-central-1.amazonaws.com/d_api* until=720h"
分析解答

有:

$ docker pull busybox
$ docker tag busybox busybox:1
$ docker tag busybox busybox:2
$ docker tag busybox busybox:3
$ docker tag busybox busybox:4

$ docker images ls --filter 'reference=busybox'
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      1         a416a98b71e2   8 weeks ago   4.26MB
busybox      2         a416a98b71e2   8 weeks ago   4.26MB
busybox      3         a416a98b71e2   8 weeks ago   4.26MB
busybox      4         a416a98b71e2   8 weeks ago   4.26MB
busybox      latest    a416a98b71e2   8 weeks ago   4.26MB

然后删除除最后3个(使用bash)以外的所有内容:

$ docker images ls --filter 'reference=busybox' | head -n -3 | awk 'NR>1{print $1 ":" $2'} | xargs -I {} docker image rm {}
Untagged: busybox:1
Untagged: busybox:2

$ docker images ls --filter 'reference=busybox'
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      3         a416a98b71e2   8 weeks ago   4.26MB
busybox      4         a416a98b71e2   8 weeks ago   4.26MB
busybox      latest    a416a98b71e2   8 weeks ago   4.26MB