diff --git a/backend/user/build.sh b/backend/user/build.sh index e2551a9..b5f2c8f 100644 --- a/backend/user/build.sh +++ b/backend/user/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -e +set -euo pipefail # 更严格的错误检查:未定义变量报错、管道错误传递 # 定义日志函数(带时间戳和级别) log_info() { @@ -14,44 +14,69 @@ log_error() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] [ERROR] $1" >&2 } -# 定义镜像信息 +# 定义配置常量(集中管理,便于修改) IMAGE_NAME="user-api" IMAGE_TAG="1.0.0" FULL_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}" COMPOSE_PROJECT_NAME="user_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 "===== 开始执行构建脚本 =====" -# 步骤1:删除现有镜像 +# 前置检查:确保必要文件和目录存在 +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} 不存在,跳过删除步骤" + log_warn "镜像 ${FULL_IMAGE} 不存在或无法删除,跳过删除步骤" fi -# 步骤2:构建新镜像 -log_info "开始构建新镜像: ${FULL_IMAGE}(Dockerfile位于src目录)" -if sudo docker build -t "${FULL_IMAGE}" -f ./src/Dockerfile .; then +# 步骤3:构建新镜像 +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 -# 步骤3:停止docker-compose服务 -log_info "开始停止编排服务: ${COMPOSE_PROJECT_NAME}" -if [ ! -f "$DOCKER_COMPOSE_FILE" ]; then - log_error "未找到docker-compose文件: ${DOCKER_COMPOSE_FILE}" - exit 1 -fi - -log_info "执行 docker-compose down 命令" -if docker-compose -f "$DOCKER_COMPOSE_FILE" -p "$COMPOSE_PROJECT_NAME" down; then - log_info "编排服务 ${COMPOSE_PROJECT_NAME} 已成功停止" +# 步骤4:启动新服务 +log_info "开始启动编排服务: ${COMPOSE_PROJECT_NAME}" +if docker-compose -f "$DOCKER_COMPOSE_FILE" -p "$COMPOSE_PROJECT_NAME" up -d; then + log_info "编排服务 ${COMPOSE_PROJECT_NAME} 已成功启动" else - log_error "编排服务 ${COMPOSE_PROJECT_NAME} 停止失败" + log_error "编排服务 ${COMPOSE_PROJECT_NAME} 启动失败" exit 1 fi diff --git a/backend/user/src/build.sh b/backend/user/src/build.sh deleted file mode 100644 index e2551a9..0000000 --- a/backend/user/src/build.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -set -e - -# 定义日志函数(带时间戳和级别) -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="user-api" -IMAGE_TAG="1.0.0" -FULL_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}" -COMPOSE_PROJECT_NAME="user_service" -DOCKER_COMPOSE_FILE="./docker-compose.yaml" - -log_info "===== 开始执行构建脚本 =====" - -# 步骤1:删除现有镜像 -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 - -# 步骤2:构建新镜像 -log_info "开始构建新镜像: ${FULL_IMAGE}(Dockerfile位于src目录)" -if sudo docker build -t "${FULL_IMAGE}" -f ./src/Dockerfile .; then - log_info "镜像 ${FULL_IMAGE} 构建成功" -else - log_error "镜像 ${FULL_IMAGE} 构建失败" - exit 1 -fi - -# 步骤3:停止docker-compose服务 -log_info "开始停止编排服务: ${COMPOSE_PROJECT_NAME}" -if [ ! -f "$DOCKER_COMPOSE_FILE" ]; then - log_error "未找到docker-compose文件: ${DOCKER_COMPOSE_FILE}" - exit 1 -fi - -log_info "执行 docker-compose down 命令" -if docker-compose -f "$DOCKER_COMPOSE_FILE" -p "$COMPOSE_PROJECT_NAME" down; then - log_info "编排服务 ${COMPOSE_PROJECT_NAME} 已成功停止" -else - log_error "编排服务 ${COMPOSE_PROJECT_NAME} 停止失败" - exit 1 -fi - -log_info "===== 构建脚本执行完成 =====" \ No newline at end of file