如何自动删除在构建过程中创建的旧映像?

时间:2019-09-23 07:14:24

标签: docker automation continuous-deployment

我在gitlab的项目中实现了ci / cd自动化,将代码推送到master分支后,gitlabRunner在服务器上创建了一个新的docker映像,并将最新的提交哈希设置为该映像上的标记,并使用新图片。一段时间后,有很多未使用的图像,我想自动删除它们。

我手动删除了旧图像。

这是我的Makefile

NAME   := farvisun/javabina
TAG    := $$(git log -1 --pretty=%h)
IMG    := ${NAME}:${TAG}
LATEST := ${NAME}:latest

app_build:
    docker build -t ${IMG} -f javabina.dockerfile . && \
    docker tag ${IMG} ${LATEST}

app_up:
    docker-compose -p farvisun-javabina up -d javabina

在所有这些之后,我想要一个简单的bash代码或其他工具来删除未使用的图像,例如保留3个最新图像,或保留过去2天构建,并删除其他图像。

2 个答案:

答案 0 :(得分:1)

如果只保留一个图像,可以使用docker image prune -f,它将删除除与容器关联的图像以外的所有图像,因此,如果在容器运行时运行此命令,它将删除其余图像。

不要忘记每次都频繁运行docker system prune,以进一步减少存储使用量。

在需要保留多个图像的情况下,可以尝试以下操作:

#!/bin/bash
for tag in $(docker image ls | sed 1,4d | awk '{print $3}')
do
    docker image rm -f $tag
done

第一行将列出所有docker映像,从列表中删除要保留的前3个,仅选择具有映像ID的列。然后,对于每个ID,我们都会删除图片。

如果要删除更多内容,请将4d更改为另一个数字。请注意,第一行是标题,因此必须始终将其删除。

如果您想先按标签过滤图像,则可以制作自己的过滤器。

答案 1 :(得分:0)

您可以在编译器中安排“ docker image prune”命令(例如,每天一次或每周一次)。 https://docs.docker.com/engine/reference/commandline/image_prune/