如何清理Jenkins节点上项目相关Docker镜像或避免本地缓存?
问题描述
在Jenkins构建节点上通过Jenkins构建部署项目,项目使用dockerfile maven plugin完成镜像构建、打标签并推送到Nexus。近期发现构建节点磁盘空间被占满,推测是Jenkins任务完成后Docker本地缓存数据导致。需要实现以下任一目标:
- 仅清理与当前项目相关的Docker镜像或构建产物;
- 构建推送镜像到Nexus完成后,不保留本地的Docker构建产物及镜像。
docker system prune --volumes --all --force方案不可行,因为会误删他人数据。
目前使用构建前的bash命令清理相关悬空镜像,想知道Docker是否有内置功能实现该需求,还是当前方式已是最优解?
当前使用的命令:
value=$(docker images | grep -e "myAppTag" | grep -e "<none>" | tr -s ' ' | cut -d' ' -f3); if [ "$value" != "" ]; then docker rmi $value; fi
解决方案
一、Docker内置功能实现精准清理
1. 精准过滤并删除项目相关镜像
构建推送完成后,可直接利用Docker内置的过滤参数,只清理当前项目的镜像:
- 删除项目相关的悬空镜像:
docker images --filter "reference=myAppTag*" --filter "dangling=true" -q | xargs -r docker rmi
这里--filter "reference=myAppTag*"仅匹配前缀为myAppTag的镜像,--filter "dangling=true"筛选无标签的悬空镜像,-q只输出镜像ID,xargs -r确保只有当有有效输出时才执行删除,避免空输入报错。
- 如果需要删除项目的所有本地镜像(包括已打标签的):
docker images --filter "reference=myAppTag*" -q | xargs -r docker rmi
2. 构建时自动清理中间产物
如果你的Docker版本支持BuildKit(18.09+),可以在构建阶段直接自动清理临时容器和中间镜像:
- 在
dockerfile maven plugin配置中开启清理:
<configuration> <dockerfile>${project.basedir}/Dockerfile</dockerfile> <cleanup>true</cleanup> <!-- 构建完成后自动清理中间镜像 --> </configuration>
- 或者直接用Docker命令构建时添加
--rm参数:
docker build --rm -t myAppTag:latest .
--rm会在构建成功后自动删除构建过程中生成的临时容器,减少磁盘占用。
二、优化现有脚本
你当前的脚本可以替换为更稳定的Docker内置过滤方式,避免因docker images输出格式变化导致的错误:
docker images --filter "reference=myAppTag*" --filter "dangling=true" -q | xargs -r docker rmi
结论
Docker有内置的精准清理功能,并非只能依赖自定义脚本。最优解是结合两种方式:
- 构建阶段开启自动清理,减少中间产物残留;
- 构建推送完成后,用过滤命令精准删除当前项目的所有本地镜像,确保磁盘无冗余数据。
内容的提问来源于stack exchange,提问作者pebble unit
相关产品推荐
相关产品推荐

