#!/bin/bash set -euo pipefail # 更严格的错误检查:未定义变量报错、管道错误传递 # 定义日志函数(带时间戳和级别) log_info() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] [INFO] $1" } log_warn() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] [WARN] $1" >&2 } log_error() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] [ERROR] $1" >&2 } # 定义配置常量(等号两侧无空格!集中管理,便于修改) IMAGE_NAME="asset-assistant-api" IMAGE_TAG="1.0.0" FULL_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}" COMPOSE_PROJECT_NAME="asset_assistant_service" DOCKER_COMPOSE_FILE="./docker-compose.yaml" SRC_DIR="./src" DOCKERFILE_PATH="${SRC_DIR}/Dockerfile" # 检查目录和文件存在性的通用函数 check_exists() { local path="$1" # 变量引用加引号,避免路径含空格报错 local type="$2" # "file" 或 "dir" local desc="$3" if [ "$type" = "file" ] && [ ! -f "$path" ]; then log_error "缺失必要文件: $desc ($path)" exit 1 elif [ "$type" = "dir" ] && [ ! -d "$path" ]; then log_error "缺失必要目录: $desc ($path)" exit 1 fi } log_info "===== 开始执行构建脚本 =====" # 前置检查:确保必要文件和目录存在 check_exists "$DOCKER_COMPOSE_FILE" "file" "docker-compose配置文件" check_exists "$SRC_DIR" "dir" "源代码目录" check_exists "$DOCKERFILE_PATH" "file" "Dockerfile" # 步骤1:停止docker-compose服务(变量引用加引号,兼容路径含空格) log_info "开始停止编排服务: ${COMPOSE_PROJECT_NAME}" if docker-compose -f "$DOCKER_COMPOSE_FILE" -p "$COMPOSE_PROJECT_NAME" down; then log_info "编排服务 ${COMPOSE_PROJECT_NAME} 已成功停止" else log_warn "编排服务 ${COMPOSE_PROJECT_NAME} 停止失败或未运行,继续执行后续步骤" fi # 步骤2:删除现有镜像(忽略不存在的情况) log_info "尝试删除现有镜像: ${FULL_IMAGE}" if sudo docker rmi -f "${FULL_IMAGE}" >/dev/null 2>&1; then log_info "镜像 ${FULL_IMAGE} 删除成功" else log_warn "镜像 ${FULL_IMAGE} 不存在或无法删除,跳过删除步骤" fi # 步骤3:构建新镜像(切换到src目录,避免路径问题) log_info "开始构建新镜像: ${FULL_IMAGE}(Dockerfile位于${DOCKERFILE_PATH})" if cd "$SRC_DIR" && sudo docker build -t "${FULL_IMAGE}" -f Dockerfile .; then log_info "镜像 ${FULL_IMAGE} 构建成功" else log_error "镜像 ${FULL_IMAGE} 构建失败" exit 1 fi # 步骤4:启动docker-compose服务(变量引用加引号) log_info "开始启动编排服务: ${COMPOSE_PROJECT_NAME}" cd .. if docker-compose -f "$DOCKER_COMPOSE_FILE" -p "$COMPOSE_PROJECT_NAME" up -d; then log_info "编排服务 ${COMPOSE_PROJECT_NAME} 已成功启动" # 额外输出运行状态,提升用户体验 log_info "当前运行的容器:" docker-compose -f "$DOCKER_COMPOSE_FILE" -p "$COMPOSE_PROJECT_NAME" ps else log_error "编排服务 ${COMPOSE_PROJECT_NAME} 启动失败" exit 1 fi log_info "===== 构建脚本执行完成 ====="