Files
PropertyDeployment/prod-env/clean-docker.sh
2025-12-09 20:22:03 +08:00

157 lines
4.1 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "🎉 所有清理步骤完成!"