#!/bin/bash set -e # 读取 .env 以获取 VOLUMES_USE ENV_FILE=".env" if [ ! -f "$ENV_FILE" ]; then echo "❌ 错误:未找到 .env 文件" exit 1 fi VOLUMES_USE=$(grep -v '^$' "$ENV_FILE" | grep -v '^#' | grep '^VOLUMES_USE=' | sed 's/^VOLUMES_USE=//' | sed 's/["'\''"]//g') SSL_USE=$(grep -v '^$' "$ENV_FILE" | grep -v '^#' | grep '^SSL_USE=' | sed 's/^SSL_USE=//' | sed 's/["'\''"]//g') if [ -z "$VOLUMES_USE" ]; then echo "❌ 错误:.env 中没有找到 VOLUMES_USE" exit 1 fi echo "📁 检测到 VOLUMES_USE = $VOLUMES_USE" if [ -z "$SSL_USE" ]; then echo "❌ 错误:.env 中没有找到 SSL_USE" exit 1 fi echo "📁 检测到 SSL_USE = $SSL_USE" echo "==========================================" echo "⚠️ Docker 清理脚本" echo "将执行以下操作:" echo "1. 停止所有容器" echo "2. 删除所有容器" echo "3. 删除所有不含 'mysql' 的卷" echo "4. 删除指定镜像" echo "5. 删除 ${VOLUMES_USE} 下所有不含 'mysql' 的文件夹" echo "==========================================" read -p "确认执行?(y/n): " confirm confirm=${confirm:-n} if [[ ! "$confirm" =~ ^[Yy]$ ]]; then echo "❌ 已取消操作。" exit 0 fi ############################ # 停止所有容器 ############################ echo "🛑 停止所有容器..." docker stop $(docker ps -aq) 2>/dev/null || echo "没有正在运行的容器" ############################ # 删除所有容器 ############################ echo "🗑️ 删除所有容器..." docker rm -f $(docker ps -aq) 2>/dev/null || echo "没有容器可删除" ############################ # 删除不含 mysql,certbot,redis 的 Docker 卷 ############################ echo "📦 删除所有不包含 'mysql' 或 'certbot' 或者 'redis' 的 Docker 卷..." # 获取所有 Docker 卷的名称 all_volumes=$(docker volume ls -q) # 遍历所有卷 for v in $all_volumes; do # 检查卷名是否包含 'mysql' 或 'certbot'(不区分大小写) if [[ "$v" == *mysql* || "$v" == *certbot* || "$v" == *redis* ]]; then echo "✅ 保留卷:$v" else echo "🗑️ 删除卷:$v" # 执行删除操作(如需先确认,可在 rm 前加 echo 测试,例如:echo docker volume rm "$v") docker volume rm "$v" fi done echo "🔚 清理完成!" ############################ # 删除指定镜像 ############################ echo "🖼️ 删除指定镜像..." IMAGES=( "prod-env-micro-community-boot:latest" "prod-env-micro-community-iot-web:latest" "prod-env-micro-community-iot:latest" "prod-env-micro-community-web:latest" "prod-env-volume-helper-ssh:latest" "prod-env-wechat-owner-service-web:latest" ) for img in "${IMAGES[@]}"; do if [ -n "$(docker images -q "$img")" ]; then echo "删除镜像:$img" docker rmi -f "$img" else echo "镜像不存在:$img" fi done ############################ # 删除 VOLUMES_USE 下不含 mysql 的文件夹 ############################ echo "🗂️ 删除 ${VOLUMES_USE} 下不含 mysql 的文件夹..." if [ ! -d "$VOLUMES_USE" ]; then echo "❌ $VOLUMES_USE 不存在,跳过目录清理" else for d in "$VOLUMES_USE"/*; do if [[ -d "$d" ]]; then folder_name=$(basename "$d") if [[ "$folder_name" == *mysql* ]]; then echo "保留目录:$folder_name" else echo "删除目录:$folder_name" rm -rf "$d" fi fi done fi ############################ # 删除 SSL_USE 下不含 certbot 的文件夹 ############################ echo "🗂️ 删除 ${SSL_USE} 下不含 certbot 的文件夹..." if [ ! -d "$SSL_USE" ]; then echo "❌ $SSL_USE 不存在,跳过目录清理" else for d in "$SSL_USE"/*; do if [[ -d "$d" ]]; then folder_name=$(basename "$d") if [[ "$folder_name" == *certbot* ]]; then echo "保留目录:$folder_name" else echo "删除目录:$folder_name" rm -rf "$d" fi fi done fi echo "🎉 所有清理步骤完成!"