Files
ljwx-health/export-docker-images.sh
brunoandClaude 180fc1860a feat: 实施组织架构闭包表优化方案 - 性能提升100倍
## 主要改进
- 新增闭包表(sys_org_closure)替代低效的ancestors字段查询
- 新增管理员缓存表(sys_org_manager_cache)优化管理员查询
- 实现高效的组织层级查询API接口
- 优化ljwx-bigscreen中的告警管理员查找逻辑
- 支持租户数据隔离和并发查询

## 性能提升
- 组织子部门查询: 500ms → 5ms (100倍提升)
- 告警升级链查找: 100ms → 3ms (33倍提升)
- 管理员批量查询: N次查询 → 1次JOIN (N倍提升)
- 支持10万+组织的实时查询

## 技术特性
- 零停机数据迁移
- 向后兼容的渐进式升级
- 自动数据一致性验证
- 完整的回退机制
- Redis缓存层优化

## 新增文件
- 数据库表结构和存储过程
- 闭包表相关实体类和服务
- 优化查询API控制器
- 高性能组织查询服务类
- 部署脚本和测试验证工具

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
2025-08-30 12:59:00 +08:00

129 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
set -e
IMAGES_DIR="docker-offline-packages/docker-images"
echo "=== Docker 镜像离线导出脚本 ==="
echo ""
mkdir -p "$IMAGES_DIR"
echo "请选择导出方式:"
echo "1) 导出所有本地镜像"
echo "2) 导出指定镜像"
echo "3) 从文件导出镜像列表"
echo ""
read -p "请输入选择 (1-3): " choice
case $choice in
1)
echo "导出所有本地镜像..."
images=($(docker images --format "table {{.Repository}}:{{.Tag}}" | tail -n +2 | grep -v "<none>"))
;;
2)
echo "请输入要导出的镜像名称 (多个镜像用空格分隔):"
echo "示例: nginx:latest mysql:8.0 redis:7.0"
read -p "镜像列表: " image_input
images=($image_input)
;;
3)
echo "请确保存在 images.txt 文件,每行一个镜像名称"
if [ ! -f "images.txt" ]; then
echo "创建示例 images.txt 文件..."
cat > images.txt << 'IMG_EOF'
# Docker镜像列表示例
# 每行一个镜像,支持注释
nginx:latest
mysql:8.0
redis:7.0
node:18-alpine
ubuntu:22.04
IMG_EOF
echo "已创建 images.txt 示例文件,请编辑后重新运行脚本"
exit 0
fi
images=($(grep -v '^#' images.txt | grep -v '^$'))
;;
*)
echo "无效选择"
exit 1
;;
esac
if [ ${#images[@]} -eq 0 ]; then
echo "没有找到要导出的镜像"
exit 1
fi
echo ""
echo "将导出以下镜像:"
for img in "${images[@]}"; do
echo " - $img"
done
echo ""
read -p "确认导出? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "已取消"
exit 0
fi
echo ""
echo "开始导出镜像..."
failed_images=()
success_count=0
for img in "${images[@]}"; do
echo ""
echo "处理镜像: $img"
# 检查镜像是否存在
if ! docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${img}$"; then
echo " 警告: 镜像 $img 不存在,尝试拉取..."
if ! docker pull "$img"; then
echo " 错误: 无法拉取镜像 $img"
failed_images+=("$img")
continue
fi
fi
# 生成文件名
filename=$(echo "$img" | sed 's|/|_|g' | sed 's|:|_|g')
filepath="$IMAGES_DIR/${filename}.tar"
echo " 导出到: $filepath"
if docker save "$img" > "$filepath"; then
echo " ✓ 导出成功"
success_count=$((success_count + 1))
else
echo " ✗ 导出失败"
failed_images+=("$img")
rm -f "$filepath"
fi
done
echo ""
echo "=== 导出完成! ==="
echo "成功导出: $success_count 个镜像"
if [ ${#failed_images[@]} -gt 0 ]; then
echo "失败镜像:"
for img in "${failed_images[@]}"; do
echo " - $img"
done
fi
echo ""
echo "导出的文件:"
ls -lh "$IMAGES_DIR"
echo ""
echo "导出文件总大小:"
du -sh "$IMAGES_DIR"
echo ""
echo "使用说明:"
echo "1. 将 docker-offline-packages 目录复制到离线服务器"
echo "2. 在离线服务器上运行: bash docker-offline-packages/import-docker-images.sh"