116 lines
3.4 KiB
Bash
116 lines
3.4 KiB
Bash
#!/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
|
||
|
||
|