如何使用docker container prune仅删除指定时间前停止的容器
实现按停止时长过滤删除已退出容器的方案
原生docker container prune目前仅支持通过until过滤器按容器创建时间筛选,没有直接提供按容器停止时间过滤的官方参数,可以通过结合容器元数据字段筛选的方式实现需求。
实现逻辑
所有已退出容器的State.FinishedAt字段会永久记录容器的退出时间戳,我们只要先筛选出所有处于exited状态的容器,再对比该字段的时间和当前时间的差值,即可筛选出停止时长超过阈值的容器进行删除。
操作步骤
方案1:通用Shell实现(无额外依赖,兼容大部分Linux发行版)
首先执行预览命令,确认待删除的容器清单,避免误删:
# 预览所有已停止超过2小时的容器 docker ps -a --filter "status=exited" --format '{{.ID}} {{.Names}}' | while read -r cid cname; do finish_ts=$(docker inspect -f '{{.State.FinishedAt}}' "$cid" | date -f - +%s) now_ts=$(date +%s) # 阈值单位为秒,2小时对应7200秒,可按需修改 if [ $((now_ts - finish_ts)) -gt 7200 ]; then echo "待删除:$cid $cname" fi done
确认清单无误后执行删除命令:
# 实际删除所有已停止超过2小时的容器 docker ps -a --filter "status=exited" --format '{{.ID}}' | while read -r cid; do finish_ts=$(docker inspect -f '{{.State.FinishedAt}}' "$cid" | date -f - +%s) now_ts=$(date +%s) if [ $((now_ts - finish_ts)) -gt 7200 ]; then docker rm "$cid" > /dev/null && echo "已删除:$cid" fi done
注意:如果在macOS系统上执行,需要把
date -f - +%s替换为date -j -f "%Y-%m-%dT%H:%M:%S.%fZ" "$(docker inspect -f '{{.State.FinishedAt}}' $cid)" +%s,macOS自带的date命令参数与GNU date存在差异。
方案2:简化版(需提前安装jq工具)
如果系统已安装jq,可使用更简洁的命令实现:
# 预览符合条件的容器 docker ps -a --filter status=exited --format '{{.ID}}' | xargs docker inspect | jq -r --argjson cutoff $(( $(date +%s) - 7200 )) '.[] | select(.State.FinishedAt | fromdate < $cutoff) | .Id' # 实际删除符合条件的容器 docker ps -a --filter status=exited --format '{{.ID}}' | xargs docker inspect | jq -r --argjson cutoff $(( $(date +%s) - 7200 )) '.[] | select(.State.FinishedAt | fromdate < $cutoff) | .Id' | xargs docker rm
- 两种方案中的
7200为停止时长阈值,单位为秒,可按需调整:比如12小时对应43200,30分钟对应1800。 - 所有删除操作执行前都建议先跑预览命令确认匹配结果,避免误删业务容器。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

