#!/bin/bash # DMS合规性测试工具 Docker构建脚本 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 配置 IMAGE_NAME="dms-compliance-tool" IMAGE_TAG="latest" CONTAINER_NAME="dms-compliance-tool" echo -e "${BLUE}=== DMS合规性测试工具 Docker构建脚本 ===${NC}" # 函数:打印带颜色的消息 print_message() { echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查Docker是否安装 check_docker() { if ! command -v docker &> /dev/null; then print_error "Docker未安装,请先安装Docker" exit 1 fi print_message "Docker已安装: $(docker --version)" } # 检查Docker Compose是否安装 check_docker_compose() { if ! command -v docker-compose &> /dev/null; then print_warning "Docker Compose未安装,将使用docker compose命令" COMPOSE_CMD="docker compose" else COMPOSE_CMD="docker-compose" print_message "Docker Compose已安装: $(docker-compose --version)" fi } # 停止并删除现有容器 cleanup_existing() { print_message "清理现有容器..." if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then print_message "停止现有容器..." docker stop $CONTAINER_NAME fi if docker ps -aq -f name=$CONTAINER_NAME | grep -q .; then print_message "删除现有容器..." docker rm $CONTAINER_NAME fi # 删除旧镜像(可选) if [[ "$1" == "--clean" ]]; then if docker images -q $IMAGE_NAME:$IMAGE_TAG | grep -q .; then print_message "删除旧镜像..." docker rmi $IMAGE_NAME:$IMAGE_TAG fi fi } # 构建Docker镜像 build_image() { print_message "构建Docker镜像..." docker build -f docker/Dockerfile.service -t $IMAGE_NAME:$IMAGE_TAG . if [ $? -eq 0 ]; then print_message "镜像构建成功: $IMAGE_NAME:$IMAGE_TAG" else print_error "镜像构建失败" exit 1 fi } # 创建必要的目录 create_directories() { print_message "创建必要的目录..." mkdir -p test_reports uploads logs config } # 运行容器 run_container() { print_message "启动容器..." docker run -d \ --name $CONTAINER_NAME \ -p 5050:5050 \ -p 5051:5051 \ -v $(pwd)/test_reports:/app/test_reports \ -v $(pwd)/uploads:/app/uploads \ -v $(pwd)/logs:/app/logs \ -e TZ=Asia/Shanghai \ --restart unless-stopped \ $IMAGE_NAME:$IMAGE_TAG if [ $? -eq 0 ]; then print_message "容器启动成功" print_message "API服务地址: http://localhost:5050" print_message "历史查看器地址: http://localhost:5051" else print_error "容器启动失败" exit 1 fi } # 使用Docker Compose运行 run_with_compose() { print_message "使用Docker Compose启动服务..." $COMPOSE_CMD up -d if [ $? -eq 0 ]; then print_message "服务启动成功" print_message "API服务地址: http://localhost:5050" print_message "历史查看器地址: http://localhost:5051" else print_error "服务启动失败" exit 1 fi } # 显示帮助信息 show_help() { echo "用法: $0 [选项]" echo "" echo "选项:" echo " --clean 清理旧镜像后重新构建" echo " --compose 使用Docker Compose启动" echo " --build-only 仅构建镜像,不启动容器" echo " --help 显示此帮助信息" echo "" echo "示例:" echo " $0 # 构建并启动容器" echo " $0 --clean # 清理后重新构建并启动" echo " $0 --compose # 使用Docker Compose启动" echo " $0 --build-only # 仅构建镜像" } # 主函数 main() { case "$1" in --help) show_help exit 0 ;; --clean) check_docker cleanup_existing --clean create_directories build_image run_container ;; --compose) check_docker check_docker_compose create_directories $COMPOSE_CMD down $COMPOSE_CMD build run_with_compose ;; --build-only) check_docker cleanup_existing build_image print_message "镜像构建完成,使用以下命令启动容器:" print_message "docker run -d --name $CONTAINER_NAME -p 5050:5050 $IMAGE_NAME:$IMAGE_TAG" ;; "") check_docker cleanup_existing create_directories build_image run_container ;; *) print_error "未知选项: $1" show_help exit 1 ;; esac print_message "完成!" } # 执行主函数 main "$@"