Shell脚本如何清理退出的容器实例

wen 实用脚本 1

本文目录导读:

Shell脚本如何清理退出的容器实例

  1. 清理已退出的容器
  2. 完整的清理脚本
  3. 带错误处理的脚本
  4. 更高级的清理策略
  5. 定时清理的脚本
  6. 使用说明
  7. 注意事项

在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 "清理任务结束"

使用说明

  1. 直接使用命令

    # 定时执行
    docker rm $(docker ps -aq -f status=exited)
  2. 保存脚本

    chmod +x cleanup.sh
    ./cleanup.sh
  3. 添加到crontab

    # 每天凌晨3点执行清理
    crontab -e
    0 3 * * * /path/to/cleanup.sh

注意事项

  • 清理前确保没有重要数据
  • 使用 -f 参数强制清理
  • 建议先运行 docker ps -a 查看当前状态
  • 对于生产环境,建议使用 docker container prune 而非直接删除

选择哪种方法取决于你的具体需求,推荐使用 docker container prune 命令,因为它更安全且易于使用。

抱歉,评论功能暂时关闭!