我有一个简单的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