#!/usr/bin/env bash # ============================================================ # crm-app 更新重启脚本(测试环境自包含 compose,仅重启 crm-app) # # 前提:服务器上只有 jar(无源码)。crm-app 用含 LibreOffice 的基础镜像 # crm-runtime:latest + 挂载 crm-app-1.0.0-SNAPSHOT.jar 运行。mysql/redis/minio/nginx 不动。 # # 用法:把本地打好的 crm-app-1.0.0-SNAPSHOT.jar 上传到项目根目录后,运行: # ./deploy/restart.sh # 从项目根目录调用 # 或 cd deploy && ./restart.sh # ============================================================ set -euo pipefail # 定位项目根目录(本脚本在 deploy/ 下,根目录是其上一级) ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" JAR="crm-app-1.0.0-SNAPSHOT.jar" COMPOSE_FILE="docker-compose.yml" BASE_IMAGE="crm-runtime:latest" BASE_DOCKERFILE="deploy/Dockerfile.base" SERVICE="crm-app" # docker compose v2 优先,回退 v1 if docker compose version >/dev/null 2>&1; then DC="docker compose" elif command -v docker-compose >/dev/null 2>&1; then DC="docker-compose" else echo "[✗] 未找到 docker compose / docker-compose" >&2; exit 1 fi echo "==> 前置检查(项目根:$ROOT)" [ -f "$JAR" ] || { echo "[✗] 缺少 $JAR(请把本地打好的 jar 上传到项目根目录)" >&2; exit 1; } [ -f "$COMPOSE_FILE" ] || { echo "[✗] 缺少 $COMPOSE_FILE" >&2; exit 1; } echo " jar 大小:$(du -h "$JAR" | cut -f1)" # 基础镜像不存在则 build(一次性;LibreOffice 层较久) if ! docker image inspect "$BASE_IMAGE" >/dev/null 2>&1; then echo "==> 基础镜像 $BASE_IMAGE 不存在,首次构建(含 LibreOffice,耗时较久)..." docker build -f "$BASE_DOCKERFILE" -t "$BASE_IMAGE" . else echo "==> 基础镜像已存在,跳过构建" fi echo "==> 仅重启 $SERVICE(加载新 jar,其余服务不动)" # --no-deps 不牵动 mysql/redis/minio;--force-recreate 确保重挂新 jar $DC -f "$COMPOSE_FILE" up -d --no-deps --force-recreate "$SERVICE" echo "==> 最近日志(10s 内启动情况)" sleep 3 $DC -f "$COMPOSE_FILE" logs --tail=30 "$SERVICE" echo echo "[i] crm-app 不直接暴露端口,经 nginx:80 访问。核对状态:" docker ps --filter "name=$SERVICE" --format ' {{.Names}} {{.Status}}'