# ========== 阶段一:前端构建(国内 npm 源) ========== FROM node:20-alpine AS frontend # 使用国内 npm 镜像(npmmirror) COPY docker/.npmrc /root/.npmrc WORKDIR /app COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci --prefer-offline --no-audit COPY frontend/ ./ RUN npm run build # ========== 阶段二:后端构建(国内 Maven 源) ========== FROM maven:3.9-eclipse-temurin-8-alpine AS backend COPY docker/maven-settings.xml /root/.m2/settings.xml WORKDIR /build # 先复制 pom,利用层缓存 COPY backend/pom.xml ./ RUN mvn dependency:go-offline -B -q # 复制后端源码 COPY backend/src ./src # 将前端打包结果放入 Spring Boot 静态资源目录 COPY --from=frontend /app/dist ./src/main/resources/static RUN mvn package -DskipTests -B -q # ========== 阶段三:运行(单容器,仅 Java) ========== FROM eclipse-temurin:8-jre-alpine RUN apk add --no-cache libgcc tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone WORKDIR /app COPY --from=backend /build/target/*.jar app.jar ENV DATA_DIR=/app/data RUN mkdir -p ${DATA_DIR}/upload-temp EXPOSE 48080 ENTRYPOINT ["java", "-jar", "app.jar"]