docker-cleanup排除规则避坑指南:KEEP_IMAGES左锚定模式匹配深度解析

📅 2026/8/22 15:16:32
docker-cleanup排除规则避坑指南:KEEP_IMAGES左锚定模式匹配深度解析
docker-cleanup排除规则避坑指南KEEP_IMAGES左锚定模式匹配深度解析【免费下载链接】docker-cleanupDEPRECATED Automatic Docker image, container and volume cleanup项目地址: https://gitcode.com/gh_mirrors/do/docker-cleanupdocker-cleanup 是一款自动清理 Docker 已退出容器、无用镜像和数据卷的开源镜像。本文带你深度解析它的核心排除规则KEEP_IMAGES 左锚定模式匹配帮你避开最常见的配置陷阱确保重要镜像绝不会被误删。为什么需要 docker-cleanup 自动清理 在集群节点或 Jenkins 构建机上容器频繁启停会留下大量exited 容器和镜像慢慢塞满磁盘。docker-cleanup 的工作方式是每CLEAN_PERIOD默认 30 分钟执行一轮清理删除已退出/死亡的容器、未被任何容器使用的镜像、游离dangling数据卷通过排除规则保留你不想删除的镜像和容器⚠️ 官方 README 明确提示如果不配置排除规则脚本会删除所有已退出容器和无用镜像。另外该仓库已归档DEPRECATED但其匹配机制至今仍是理解 bash 模式匹配的经典范例。KEEP_IMAGES 排除规则的工作原理docker-cleanup 的清理逻辑全部在 run.sh 中实现。它的排除判断只有一行核心代码if [[ ${repo}:${tag} $PATTERN* ]]; then keepit1 # 命中排除规则保留该镜像 fi看懂这一行就理解了三大关键机制机制说明左锚定前缀匹配模式必须从字符串开头匹配foo/b能匹配foo/bar:tag但ar:tag匹配不了foo/bar:tagbash glob 通配符不是正则支持*、?、[[:alpha:]]等字符类不支持.、、^、$等正则语法逗号分隔多条规则KEEP_IMAGESmyorg/app, myorg/db表示任一规则命中即保留foo/bar:tag 的匹配结果速查表以镜像foo/bar:tag为例下面是排除规则的匹配结果排除规则是否保留原因foo/bar:tag✅完整前缀匹配foo/bar✅左锚定前缀命中foo/b✅前缀越短匹配越宽[[:alpha:]]/bar✅bash 字符类生效*:*:tag✅通配符 标签组合*:tag✅保留所有该标签的镜像foo/*:tag✅只保留该仓库下的这个标签foo/baz❌前缀不一致bar:tag❌不能从中间开始匹配:tag❌同上左锚定限制docker-cleanup 排除规则的三大常见坑 ️坑一把 KEEP_IMAGES 当正则表达式新手最容易写出^foo/.*:tag$或foo.*tag这类规则。请记住这是 bash 字符串模式匹配不是正则。.就是普通点号^、$是字面字符写进规则只会导致永远匹配不上镜像照删不误。坑二单独一个*会被当成文件名想保留所有镜像时很多人会写KEEP_IMAGES*。但脚本内部用for PATTERN in $(...)遍历规则单独的*会先触发 shell 文件名通配被展开成当前目录下的文件名规则直接失效。正确写法是*:*这才是匹配所有镜像。坑三规则匹配的是仓库名:标签不是镜像 ID脚本拿repo:tag字符串去做匹配。对于反复构建 SNAPSHOT 产生的悬空镜像它的名字是none:none如果你的规则里没有覆盖这个格式这些镜像照样会被清掉。想保留所有悬空镜像可以加上none:none规则。 补充一个隐藏细节列表中的每一条规则还会被当作完整镜像引用执行docker inspect直接把查到的镜像 ID 加入保留名单见 run.sh 第 159-165 行。所以写精确的image:tag是最稳妥的保留方式。用 DEBUG 模式验证你的排除规则 配置完规则别急着等 30 分钟把DEBUG设为1脚本会逐条打印匹配详情DEBUG: Check image foo/bar:tag DEBUG: Matches foo/bar - keeping看到Matches就说明规则生效看到No match就该回头检查写法。调试完成后记得改回DEBUG0。容器排除规则的小陷阱KEEP_CONTAINERS按镜像名匹配已退出容器KEEP_CONTAINERS_NAMED按容器名匹配。注意 Docker inspect 返回的容器名自带前导斜杠如/persistent-data而规则是左锚定的所以写persistent-data反而匹配不上建议写成*persistent-data。另外两个变量都支持填**All**表示全部保留。常用 KEEP_IMAGES 配置速查表 ⚡使用场景推荐规则保留某标签的所有镜像*:latest保留自己组织下的全部镜像myorg/*精确保留单个镜像ubuntu:trusty保留某仓库的特定标签foo/bar:tag保留所有悬空镜像none:none等效关闭镜像清理*:*多条规则组合myorg/app:1.0, myorg/db:latest其他环境变量一览以下变量均可通过docker run -e覆盖默认值定义在 Dockerfile 中变量默认值作用CLEAN_PERIOD1800每轮清理间隔秒DELAY_TIME1800删除前的延迟观察期秒防止误删正在使用的资源KEEP_IMAGES全部清理镜像排除规则左锚定 globKEEP_CONTAINERS全部清理已退出容器的排除规则按镜像名匹配KEEP_CONTAINERS_NAMED全部清理按容器名匹配注意前导斜杠LOOPtrue设为false只清理一次就退出DEBUG0设为 1 输出匹配调试信息DOCKER_API_VERSION1.20适配宿主机 Docker 版本快速部署 docker-cleanup 克隆仓库后可以用自带的 Makefile 快速构建运行环境变量放在 env.list 中git clone https://gitcode.com/gh_mirrors/do/docker-cleanup cd docker-cleanup make build make run也可以直接一条命令运行并顺手配置排除规则docker run -d --name docker-cleanup \ -v /var/run/docker.sock:/var/run/docker.sock:rw \ -v /var/lib/docker:/var/lib/docker:rw \ -e KEEP_IMAGESmyorg/*, *:latest \ -e DEBUG1 \ meltwater/docker-cleanup:latestKubernetes 用户可以直接使用 contrib/k8s-daemonset.yml在每个节点上跑一个清理容器。数据卷清理逻辑在旧版 Docker 上由 docker-cleanup-volumes.sh 处理新版则走原生docker volume命令。总结docker-cleanup 的 KEEP_IMAGES 是左锚定的 bash glob 匹配不是正则从字符串开头做前缀匹配三个高频坑误用正则语法、单独*被文件名通配吞掉、匹配对象是repo:tag而非镜像 ID调完规则记得用DEBUG1验证一遍*:*才是保留全部的正确姿势理解这套机制后写任何 shell 脚本的通配过滤逻辑都能举一反三【免费下载链接】docker-cleanupDEPRECATED Automatic Docker image, container and volume cleanup项目地址: https://gitcode.com/gh_mirrors/do/docker-cleanup创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考