#!/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