#!/bin/bash # DMS合规性测试工具 - Docker镜像打包脚本 # 用于创建离线部署包 set -e # 配置变量 EXPORT_DIR="dms-compliance-offline" IMAGE_NAME="compliance-dms-compliance-tool" NGINX_IMAGE="nginx:alpine" ARCHIVE_NAME="dms-compliance-offline-$(date +%Y%m%d-%H%M%S).tar.gz" echo "=== DMS合规性测试工具 离线部署包创建脚本 ===" # 检查Docker是否运行 if ! docker info >/dev/null 2>&1; then echo "[错误] Docker未运行或无法访问" exit 1 fi # 创建导出目录 echo "[信息] 创建导出目录: $EXPORT_DIR" rm -rf "$EXPORT_DIR" mkdir -p "$EXPORT_DIR" # 1. 构建最新镜像 echo "[信息] 构建DMS合规性测试工具镜像..." docker-compose build dms-compliance-tool # 2. 导出主应用镜像 echo "[信息] 导出主应用镜像..." docker save "$IMAGE_NAME:latest" -o "$EXPORT_DIR/dms-compliance-tool.tar" # 3. 拉取并导出nginx镜像(如果需要) echo "[信息] 拉取并导出nginx镜像..." docker pull "$NGINX_IMAGE" docker save "$NGINX_IMAGE" -o "$EXPORT_DIR/nginx-alpine.tar" # 4. 复制部署文件 echo "[信息] 复制部署文件..." # 创建离线版docker-compose文件 cat > "$EXPORT_DIR/docker-compose.yml" << 'EOF' version: '3.8' services: dms-compliance-tool: image: compliance-dms-compliance-tool:latest container_name: dms-compliance-tool ports: - "5050:5050" # API服务器端口 - "5051:5051" # 历史查看器端口 volumes: # 持久化测试报告 - ./data/test_reports:/app/test_reports # 持久化上传文件 - ./data/uploads:/app/uploads # 持久化日志 - ./data/logs:/app/logs # 如果需要自定义配置文件 - ./config:/app/config:ro environment: - FLASK_ENV=production - PYTHONUNBUFFERED=1 - TZ=Asia/Shanghai restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5050/"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - dms-network # 可选:添加一个nginx反向代理 nginx: image: nginx:alpine container_name: dms-nginx ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/ssl:/etc/nginx/ssl:ro depends_on: - dms-compliance-tool restart: unless-stopped networks: - dms-network profiles: - with-nginx networks: dms-network: driver: bridge volumes: test_reports: uploads: logs: EOF # 5. 复制nginx配置(如果存在) if [ -d "nginx" ]; then echo "[信息] 复制nginx配置..." cp -r nginx "$EXPORT_DIR/" fi # 6. 复制config目录(如果存在) if [ -d "config" ]; then echo "[信息] 复制配置文件..." cp -r config "$EXPORT_DIR/" fi # 7. 创建数据目录结构 echo "[信息] 创建数据目录结构..." mkdir -p "$EXPORT_DIR/data/test_reports" mkdir -p "$EXPORT_DIR/data/uploads" mkdir -p "$EXPORT_DIR/data/logs" # 8. 复制现有的测试报告(如果存在) if [ -d "test_reports" ] && [ "$(ls -A test_reports)" ]; then echo "[信息] 复制现有测试报告..." cp -r test_reports/* "$EXPORT_DIR/data/test_reports/" fi # 9. 创建部署脚本 echo "[信息] 创建部署脚本..." cat > "$EXPORT_DIR/deploy.sh" << 'EOF' #!/bin/bash # DMS合规性测试工具 - 离线部署脚本 set -e echo "=== DMS合规性测试工具 离线部署脚本 ===" # 检查Docker是否运行 if ! docker info >/dev/null 2>&1; then echo "[错误] Docker未运行或无法访问,请先安装并启动Docker" exit 1 fi # 检查docker-compose是否可用 if ! command -v docker-compose >/dev/null 2>&1; then echo "[错误] docker-compose未安装,请先安装docker-compose" exit 1 fi echo "[信息] 加载Docker镜像..." # 加载主应用镜像 if [ -f "dms-compliance-tool.tar" ]; then echo "[信息] 加载DMS合规性测试工具镜像..." docker load -i dms-compliance-tool.tar else echo "[错误] 找不到dms-compliance-tool.tar镜像文件" exit 1 fi # 加载nginx镜像 if [ -f "nginx-alpine.tar" ]; then echo "[信息] 加载nginx镜像..." docker load -i nginx-alpine.tar else echo "[警告] 找不到nginx-alpine.tar镜像文件,nginx服务将无法使用" fi echo "[信息] 创建必要的目录..." mkdir -p data/test_reports data/uploads data/logs echo "[信息] 设置目录权限..." # 确保目录权限正确(Docker容器中的用户ID可能不同) chmod -R 755 data/ echo "[信息] 启动服务..." docker-compose up -d echo "[信息] 等待服务启动..." sleep 10 # 检查服务状态 echo "[信息] 检查服务状态..." docker-compose ps # 检查健康状态 echo "[信息] 检查服务健康状态..." for i in {1..30}; do if curl -f http://localhost:5050/ >/dev/null 2>&1; then echo "[成功] API服务器已启动并正常运行" break fi if [ $i -eq 30 ]; then echo "[警告] API服务器健康检查超时,请检查日志" docker-compose logs dms-compliance-tool fi sleep 2 done if curl -f http://localhost:5051/ >/dev/null 2>&1; then echo "[成功] 历史查看器已启动并正常运行" else echo "[警告] 历史查看器可能未正常启动,请检查日志" fi echo "" echo "=== 部署完成 ===" echo "API服务器地址: http://localhost:5050" echo "历史查看器地址: http://localhost:5051" echo "" echo "常用命令:" echo " 查看服务状态: docker-compose ps" echo " 查看日志: docker-compose logs" echo " 停止服务: docker-compose down" echo " 重启服务: docker-compose restart" echo "" EOF chmod +x "$EXPORT_DIR/deploy.sh" # 10. 创建停止脚本 cat > "$EXPORT_DIR/stop.sh" << 'EOF' #!/bin/bash # DMS合规性测试工具 - 停止脚本 echo "=== 停止DMS合规性测试工具 ===" if [ -f "docker-compose.yml" ]; then docker-compose down echo "[信息] 服务已停止" else echo "[错误] 找不到docker-compose.yml文件" exit 1 fi EOF chmod +x "$EXPORT_DIR/stop.sh" # 11. 创建卸载脚本 cat > "$EXPORT_DIR/uninstall.sh" << 'EOF' #!/bin/bash # DMS合规性测试工具 - 卸载脚本 echo "=== 卸载DMS合规性测试工具 ===" read -p "确定要卸载DMS合规性测试工具吗?这将删除所有容器和镜像 (y/N): " confirm if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then echo "[信息] 停止并删除容器..." docker-compose down -v echo "[信息] 删除镜像..." docker rmi compliance-dms-compliance-tool:latest nginx:alpine 2>/dev/null || true echo "[信息] 清理未使用的资源..." docker system prune -f echo "[成功] 卸载完成" else echo "[信息] 取消卸载" fi EOF chmod +x "$EXPORT_DIR/uninstall.sh" # 12. 创建README文件 cat > "$EXPORT_DIR/README.md" << 'EOF' # DMS合规性测试工具 - 离线部署包 ## 系统要求 - Docker 20.10+ - Docker Compose 1.29+ - 至少2GB可用内存 - 至少5GB可用磁盘空间 ## 快速部署 1. 解压部署包到目标目录 2. 进入部署目录 3. 运行部署脚本: ```bash ./deploy.sh ``` ## 服务访问 部署成功后,可以通过以下地址访问服务: - **API服务器**: http://localhost:5050 - **历史查看器**: http://localhost:5051 ## 常用操作 ### 查看服务状态 ```bash docker-compose ps ``` ### 查看服务日志 ```bash # 查看所有服务日志 docker-compose logs # 查看特定服务日志 docker-compose logs dms-compliance-tool ``` ### 停止服务 ```bash ./stop.sh # 或者 docker-compose down ``` ### 重启服务 ```bash docker-compose restart ``` ### 完全卸载 ```bash ./uninstall.sh ``` ## 数据持久化 以下目录的数据会被持久化保存: - `data/test_reports/` - 测试报告 - `data/uploads/` - 上传的文件 - `data/logs/` - 应用日志 ## 配置文件 如需自定义配置,可以在 `config/` 目录中放置配置文件。 ## 故障排除 ### 端口冲突 如果5050或5051端口被占用,可以修改 `docker-compose.yml` 文件中的端口映射。 ### 权限问题 如果遇到权限问题,可以尝试: ```bash sudo chown -R $USER:$USER data/ chmod -R 755 data/ ``` ### 服务无法启动 1. 检查Docker是否正常运行 2. 查看服务日志:`docker-compose logs` 3. 检查系统资源是否充足 ## 技术支持 如遇到问题,请提供以下信息: - 操作系统版本 - Docker版本 - 错误日志 - 服务状态输出 EOF # 13. 创建版本信息文件 cat > "$EXPORT_DIR/VERSION" << EOF DMS合规性测试工具 离线部署包 构建时间: $(date '+%Y-%m-%d %H:%M:%S') 构建主机: $(hostname) Docker版本: $(docker --version) Docker Compose版本: $(docker-compose --version) EOF echo "[信息] 压缩部署包..." tar -czf "$ARCHIVE_NAME" "$EXPORT_DIR" echo "" echo "=== 打包完成 ===" echo "部署包: $ARCHIVE_NAME" echo "大小: $(du -h "$ARCHIVE_NAME" | cut -f1)" echo "" echo "部署说明:" echo "1. 将 $ARCHIVE_NAME 传输到目标服务器" echo "2. 解压: tar -xzf $ARCHIVE_NAME" echo "3. 进入目录: cd $EXPORT_DIR" echo "4. 运行部署: ./deploy.sh" echo ""