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