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

116 lines
3.4 KiB
Bash
Raw 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
# ==============================================
# Docker 卷操作工具(支持部分匹配)
# 作者: ChatGPT
# ==============================================
declare -A VOLUME_DESCRIPTIONS=(
["a-micro-community-iot-web-web"]="物联网前端"
["a-micro-community-web-web"]="社区前端"
["a-microcommunity-iot-jar"]="物联网后端服务包"
["a-microcommunity-jar"]="社区后端服务包"
["a-wechat-owner-service-web-web"]="业主微信前端"
["kafka_conf"]="Kafka 配置"
["kafka_data"]="Kafka 数据"
["micro-community-iot-web-config"]="物联网前端配置"
["micro-community-web-config"]="社区前端配置"
["microcommunity-iot-logs"]="物联网服务日志"
["microcommunity-logs"]="社区服务日志"
["mqtt_config"]="MQTT 配置"
["mqtt_data"]="MQTT 数据"
["mqtt_log"]="MQTT 日志"
["mysql_conf"]="MySQL 配置"
["mysql_data"]="MySQL 数据"
["mysql_files"]="MySQL 文件"
["mysql_log"]="MySQL 日志"
["redis_conf"]="Redis 配置"
["redis_data"]="Redis 数据"
["wechat-owner-service-web-config"]="业主微信前端配置"
["zookeeper_conf"]="Zookeeper 配置"
["zookeeper_data"]="Zookeeper 数据"
)
echo "=============================="
echo "Docker 卷列表"
echo "=============================="
volumes=($(docker volume ls --format "{{.Name}}"))
if [ ${#volumes[@]} -eq 0 ]; then
echo "未检测到任何 Docker 卷。"
exit 1
fi
i=1
for vol in "${volumes[@]}"; do
desc="(未识别类型)"
for key in "${!VOLUME_DESCRIPTIONS[@]}"; do
if [[ "$vol" == *"$key"* ]]; then
desc="${VOLUME_DESCRIPTIONS[$key]}"
break
fi
done
printf "%2d. %-50s %s\n" "$i" "$vol" "$desc"
((i++))
done
echo
read -p "请选择要操作的卷编号(例如 1 " choice
if ! [[ "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 1 ] || [ "$choice" -gt "${#volumes[@]}" ]; then
echo "❌ 无效选择。"
exit 1
fi
volume_name=${volumes[$((choice-1))]}
echo "✅ 你选择了卷:$volume_name"
echo
echo "请选择操作类型:"
echo "1. 查看卷信息"
echo "2. 替换卷内数据"
read -p "请输入操作编号1/2 " action
if [ "$action" == "1" ]; then
echo "=============================="
echo "卷详细信息:$volume_name"
echo "=============================="
docker volume inspect "$volume_name"
exit 0
fi
if [ "$action" == "2" ]; then
read -p "请输入要替换的本地文件夹路径(例如 /home/rf/iot-web " local_path
if [ ! -d "$local_path" ]; then
echo "❌ 文件夹不存在:$local_path"
exit 1
fi
echo "⚠️ 即将清空卷 [$volume_name] 并替换为 [$local_path] 内容!"
read -p "确认执行此操作?(y/n): " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "已取消操作。"
exit 0
fi
# 确保本地目录权限
sudo chmod -R 755 "$local_path"
sudo chown -R $(whoami):$(whoami) "$local_path"
echo "🚀 正在清空卷..."
docker run --rm -v "$volume_name":/data busybox sh -c "rm -rf /data/*"
echo "🚀 正在复制文件..."
docker run --rm -v "$volume_name":/data -v "$local_path":/src busybox sh -c "cp -r /src/. /data/"
# 修改卷文件权限,确保 Nginx 可以读取
echo "🔑 修改卷权限以保证 Nginx 访问..."
docker run --rm -v "$volume_name":/data busybox sh -c "chown -R 101:101 /data && chmod -R 755 /data"
echo "✅ 卷替换完成。"
fi
echo "❌ 无效选项。"
exit 1