本文目录导读:

在Shell脚本中清理退出的容器实例,可以使用以下几种方法:
清理已退出的容器
#!/bin/bash # 方法1:使用docker rm命令 docker rm $(docker ps -aq -f status=exited) # 方法2:使用docker container prune docker container prune -f # 方法3:带条件过滤 docker rm $(docker ps -aq --filter "status=exited" --filter "status=dead")
完整的清理脚本
#!/bin/bash
echo "开始清理退出的容器..."
# 方法1:直接清理所有退出的容器
echo "清理所有已退出的容器..."
docker rm $(docker ps -aq -f status=exited) 2>/dev/null
# 方法2:安全的清理方式(检查是否有要清理的容器)
EXITED_CONTAINERS=$(docker ps -aq -f status=exited)
if [ -n "$EXITED_CONTAINERS" ]; then
echo "找到以下退出的容器:"
docker ps -a -f status=exited
echo "正在清理..."
docker rm $EXITED_CONTAINERS
echo "清理完成!"
else
echo "没有需要清理的退出容器。"
fi
# 方法3:使用prune命令(推荐)
echo "使用prune命令清理..."
docker container prune -f --filter "until=24h" # 清理24小时前的容器
echo "清理操作完成!"
带错误处理的脚本
#!/bin/bash
set -e # 遇到错误立即退出
cleanup_exited_containers() {
local containers=$(docker ps -aq -f status=exited 2>/dev/null)
if [ $? -ne 0 ]; then
echo "错误:Docker命令执行失败"
return 1
fi
if [ -z "$containers" ]; then
echo "没有退出的容器需要清理"
return 0
fi
echo "发现以下退出的容器:"
docker ps -a -f status=exited --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
echo "正在清理..."
if docker rm $containers; then
echo "成功清理了 $(echo $containers | wc -w) 个容器"
return 0
else
echo "清理过程中发生错误"
return 1
fi
}
# 主函数
main() {
echo "=== 容器清理工具 ==="
echo "开始时间:$(date)"
echo "-------------------"
cleanup_exited_containers
echo "-------------------"
echo "完成时间:$(date)"
}
# 执行主函数
main
更高级的清理策略
#!/bin/bash
# 更全面的Docker清理脚本
cleanup_docker() {
echo "=== Docker清理工具 ==="
# 1. 清理退出的容器
echo "1. 清理退出容器..."
docker container prune -f
# 2. 清理悬空的镜像
echo "2. 清理悬空镜像..."
docker image prune -f
# 3. 清理未使用的网络
echo "3. 清理未使用网络..."
docker network prune -f
# 4. 清理未使用的数据卷
echo "4. 清理未使用数据卷..."
docker volume prune -f
# 5. 综合清理(清理所有未使用的资源)
echo "5. 综合清理..."
docker system prune -a -f --volumes
echo "=== 清理完成 ==="
}
# 带确认的清理
confirm_and_cleanup() {
echo "警告:此操作将删除所有未使用的Docker资源!"
read -p "是否继续?(y/n): " confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
cleanup_docker
else
echo "操作已取消"
fi
}
# 根据参数执行不同级别的清理
case "${1:-all}" in
"containers")
docker container prune -f
;;
"images")
docker image prune -f
;;
"all")
confirm_and_cleanup
;;
"force")
cleanup_docker
;;
*)
echo "用法:$0 [containers|images|all|force]"
exit 1
;;
esac
定时清理的脚本
#!/bin/bash
# 定时清理退出的容器(可与crontab配合使用)
# crontab示例:0 3 * * * /path/to/this/script.sh
cleanup_log="/var/log/docker-cleanup.log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$cleanup_log"
}
cleanup_containers() {
local BEFORE_CLEAN=$(docker ps -aq -f status=exited | wc -l)
if [ $BEFORE_CLEAN -gt 0 ]; then
log_message "开始清理 $BEFORE_CLEAN 个退出的容器"
docker rm $(docker ps -aq -f status=exited) 2>/dev/null
log_message "清理完成"
else
log_message "没有需要清理的容器"
fi
}
log_message "开始清理任务"
cleanup_containers
log_message "清理任务结束"
使用说明
-
直接使用命令:
# 定时执行 docker rm $(docker ps -aq -f status=exited)
-
保存脚本:
chmod +x cleanup.sh ./cleanup.sh
-
添加到crontab:
# 每天凌晨3点执行清理 crontab -e 0 3 * * * /path/to/cleanup.sh
注意事项
- 清理前确保没有重要数据
- 使用
-f参数强制清理 - 建议先运行
docker ps -a查看当前状态 - 对于生产环境,建议使用
docker container prune而非直接删除
选择哪种方法取决于你的具体需求,推荐使用 docker container prune 命令,因为它更安全且易于使用。