清理docker磁盘使用空间

点击查看代码
#!/bin/bash
# Docker 清理工具(支持单独清理日志或全流程清理)
# 用法:
#   ./script.sh          # 执行全流程清理(系统资源+日志+数据卷)
#   ./script.sh --logs   # 仅执行容器日志清理

#######################################
# 可配置参数(根据需求修改)
#######################################
LOG_SIZE_THRESHOLD="+1G"   # 日志大小阈值(如 +500M、+1G)
LOG_AGE_THRESHOLD="+7"     # 日志时间阈值(如 +7 表示7天前,单位:天)
KEEP_RUNNING_LOGS=0        # 是否保留运行中容器的日志(1=保留,0=清理)
KEEP_STOPPED_LOGS=0        # 是否保留已停止容器的日志(1=保留,0=清理)
#######################################

# 彩色输出配置
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 重置颜色

# 错误处理函数
error_handler() {
    echo -e "${RED}[错误] 步骤 $1 执行失败${NC}"
}

# 检查 Docker 环境是否可用
check_docker_env() {
    echo -e "\n=== 检查 Docker 环境 ==="
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}[错误] 未安装 Docker,请先安装 Docker${NC}"
        exit 1
    fi
    if ! docker info &> /dev/null; then
        echo -e "${RED}[错误] Docker 服务未运行,请启动 Docker 服务${NC}"
        exit 1
    fi
    echo -e "${GREEN}✅ Docker 环境正常${NC}"
}

# 独立函数:清理容器日志
clean_container_logs() {
    echo -e "\n=== 容器日志清理 ==="
    local LOG_PATH="/var/lib/docker/containers"
    
    # 检查日志目录是否存在
    if [ ! -d "$LOG_PATH" ]; then
        echo -e "${YELLOW}⚠️ 容器日志目录 $LOG_PATH 不存在,跳过日志清理${NC}"
        return 0
    fi

    # 1. 获取符合条件的容器ID(根据是否保留运行中/停止容器日志筛选)
    local TARGET_CONTAINERS=""
    if [ $KEEP_RUNNING_LOGS -eq 0 ] && [ $KEEP_STOPPED_LOGS -eq 0 ]; then
        # 清理所有容器的日志(运行中+已停止)
        TARGET_CONTAINERS=$(docker ps -aq)  # 所有容器ID
    elif [ $KEEP_RUNNING_LOGS -eq 0 ] && [ $KEEP_STOPPED_LOGS -eq 1 ]; then
        # 只清理运行中容器的日志
        TARGET_CONTAINERS=$(docker ps --format "{{.ID}}")  # 运行中容器ID
    elif [ $KEEP_RUNNING_LOGS -eq 1 ] && [ $KEEP_STOPPED_LOGS -eq 0 ]; then
        # 只清理已停止容器的日志
        TARGET_CONTAINERS=$(docker ps -aq --filter "status=exited")  # 已停止容器ID
    else
        echo -e "${YELLOW}⚠️ 配置不允许同时保留运行中+已停止容器的日志,跳过清理${NC}"
        return 0
    fi

    # 2. 筛选符合大小+时间条件的日志文件
    if [ -z "$TARGET_CONTAINERS" ]; then
        echo -e "${GREEN}✅ 没有符合条件的容器日志需要清理${NC}"
        return 0
    fi

    # 转换容器ID为正则表达式(用于匹配日志文件)
    local CONTAINER_REGEX=$(echo "$TARGET_CONTAINERS" | tr '\n' '|' | sed 's/|$//')
    local LOG_FILES=$(find "$LOG_PATH" \
        -type f \
        -name '*-json.log' \
        -size "$LOG_SIZE_THRESHOLD" \
        -mtime "$LOG_AGE_THRESHOLD" \
        | grep -E "$CONTAINER_REGEX")

    # 3. 显示待清理的日志文件并确认
    if [ -z "$LOG_FILES" ]; then
        echo -e "${GREEN}✅ 没有超过 ${LOG_SIZE_THRESHOLD} 且存在 ${LOG_AGE_THRESHOLD} 天以上的日志文件${NC}"
        return 0
    fi

    echo -e "${YELLOW}即将清理以下日志文件(大小>${LOG_SIZE_THRESHOLD} 且 存在>${LOG_AGE_THRESHOLD}天):${NC}"
    echo "$LOG_FILES" | while read -r logfile; do
        # 显示日志文件大小和路径
        du -sh "$logfile" | awk '{print "  - " $1 "\t" $2}'
    done

    read -p "确认清理以上日志文件?[y/N] " confirm
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
        echo -e "${YELLOW}⚠️ 已取消日志清理${NC}"
        return 0
    fi

    # 4. 执行清理(清空文件内容,保留文件)
    echo "开始清理..."
    echo "$LOG_FILES" | while read -r logfile; do
        truncate -s 0 "$logfile" && echo "  已清空:$logfile"
    done
    echo -e "${GREEN}✅ 容器日志清理完成${NC}"
}

# 清理 Docker 系统资源(镜像、容器、构建缓存)
clean_system_resources() {
    echo -e "\n=== 清理 Docker 系统资源 ==="
    echo "清理未使用的镜像、容器、网络..."
    if ! docker system prune -a -f; then
        error_handler "系统资源清理"
    else
        echo -e "${GREEN}✅ 系统资源清理完成${NC}"
    fi

    echo "清理构建缓存..."
    if ! docker builder prune -a -f; then
        error_handler "构建缓存清理"
    else
        echo -e "${GREEN}✅ 构建缓存清理完成${NC}"
    fi
}

# 清理未使用的数据卷
clean_volumes() {
    echo -e "\n=== 清理未使用的数据卷 ==="
    echo "清理无关联容器的数据卷..."
    if ! docker volume prune -f; then
        error_handler "数据卷清理"
    else
        echo -e "${GREEN}✅ 数据卷清理完成${NC}"
    fi
}

# 显示清理后资源使用情况
show_usage() {
    echo -e "\n=== 清理后 Docker 资源使用情况 ==="
    docker system df
}

#######################################
# 主程序入口
#######################################
main() {
    check_docker_env

    # 根据参数选择执行模式
    if [ "$1" = "--logs" ]; then
        echo -e "${YELLOW}>>> 执行模式:仅清理容器日志${NC}"
        clean_container_logs
    else
        echo -e "${YELLOW}>>> 执行模式:全流程清理(系统资源+日志+数据卷)${NC}"
        # 全流程执行前确认
        echo -e "\n${YELLOW}注意:将清理未使用的镜像、容器、缓存、数据卷及符合条件的日志${NC}"
        read -p "是否继续执行全流程清理?[y/N] " confirm
        if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
            echo "已取消执行"
            exit 0
        fi

        clean_system_resources
        clean_container_logs
        clean_volumes
        show_usage
    fi

    echo -e "\n${GREEN}🎉 操作完成${NC}"
}

# 启动主程序
main "$@"

使用方法:
全流程清理(默认):清理系统资源 + 日志 + 数据卷

点击查看代码
bash script.sh
**仅清理容器日志(单独执行日志清理功能):**
点击查看代码
bash script.sh --logs
**执行结果**
点击查看代码
=== 检查 Docker 环境 ===
✅ Docker 环境正常
>>> 执行模式:全流程清理(系统资源+日志+数据卷)

注意:将清理未使用的镜像、容器、缓存、数据卷及符合条件的日志
是否继续执行全流程清理?[y/N] n  
已取消执行
[root@k8s-master233 ~]# vim 45.sh 
[root@k8s-master233 ~]# bash 45.sh 

=== 检查 Docker 环境 ===
✅ Docker 环境正常
>>> 执行模式:全流程清理(系统资源+日志+数据卷)

注意:将清理未使用的镜像、容器、缓存、数据卷及符合条件的日志
是否继续执行全流程清理?[y/N] y

=== 清理 Docker 系统资源 ===
清理未使用的镜像、容器、网络...
Total reclaimed space: 0B
✅ 系统资源清理完成
清理构建缓存...
Total reclaimed space: 0B
✅ 构建缓存清理完成

=== 容器日志清理 ===
✅ 没有符合条件的容器日志需要清理

=== 清理未使用的数据卷 ===
清理无关联容器的数据卷...
Total reclaimed space: 0B
✅ 数据卷清理完成

=== 清理后 Docker 资源使用情况 ===
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          4         4         247.5MB   3.88MB (1%)
Containers      7         7         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

🎉 操作完成

posted @ 2025-11-03 16:26  你腿别抖了  阅读(6)  评论(0)    收藏  举报