# 多阶段构建 Dockerfile for 若依后端应用 # Stage 1: 构建阶段 - 使用Maven构建应用 FROM maven:3.9-eclipse-temurin-8 AS builder # 设置工作目录 WORKDIR /app # 复制Maven配置文件 COPY pom.xml . COPY ruoyi-admin/pom.xml ruoyi-admin/ COPY ruoyi-framework/pom.xml ruoyi-framework/ COPY ruoyi-system/pom.xml ruoyi-system/ COPY ruoyi-quartz/pom.xml ruoyi-quartz/ COPY ruoyi-generator/pom.xml ruoyi-generator/ COPY ruoyi-common/pom.xml ruoyi-common/ COPY ruoyi-credit/pom.xml ruoyi-credit/ COPY ruoyi-blockchain/pom.xml ruoyi-blockchain/ COPY ruoyi-payment/pom.xml ruoyi-payment/ COPY ruoyi-security/pom.xml ruoyi-security/ COPY ruoyi-notification/pom.xml ruoyi-notification/ COPY ruoyi-analytics/pom.xml ruoyi-analytics/ COPY ruoyi-workflow/pom.xml ruoyi-workflow/ COPY ruoyi-integration/pom.xml ruoyi-integration/ COPY ruoyi-monitor/pom.xml ruoyi-monitor/ # 下载依赖 (利用Docker缓存层优化) RUN mvn dependency:go-offline -B # 复制源代码 COPY ruoyi-admin/src ruoyi-admin/src COPY ruoyi-framework/src ruoyi-framework/src COPY ruoyi-system/src ruoyi-system/src COPY ruoyi-quartz/src ruoyi-quartz/src COPY ruoyi-generator/src ruoyi-generator/src COPY ruoyi-common/src ruoyi-common/src COPY ruoyi-credit/src ruoyi-credit/src COPY ruoyi-blockchain/src ruoyi-blockchain/src COPY ruoyi-payment/src ruoyi-payment/src COPY ruoyi-security/src ruoyi-security/src COPY ruoyi-notification/src ruoyi-notification/src COPY ruoyi-analytics/src ruoyi-analytics/src COPY ruoyi-workflow/src ruoyi-workflow/src COPY ruoyi-integration/src ruoyi-integration/src COPY ruoyi-monitor/src ruoyi-monitor/src # 执行Maven构建,跳过测试以加快构建速度 RUN mvn clean package -DskipTests -B # Stage 2: 运行阶段 - 使用轻量级JRE镜像 FROM eclipse-temurin:8-jre-alpine # FROM openjdk:8-jre-alpine # 设置时区并安装必要工具 RUN apk add --no-cache tzdata netcat-openbsd curl bash && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone && \ apk del tzdata # 创建应用用户 (安全最佳实践) RUN addgroup -g 1000 anxin && \ adduser -D -s /bin/sh -u 1000 -G anxin anxin # 设置工作目录 WORKDIR /app # 从构建阶段复制JAR文件 COPY --from=builder /app/ruoyi-admin/target/ruoyi-admin.jar app.jar # 创建日志目录、配置目录和脚本目录 RUN mkdir -p /app/logs /app/config /app/uploadPath /app/scripts && \ mkdir -p /home/ruoyi && \ ln -sf /app/logs /home/ruoyi/logs # 复制Docker环境配置文件和脚本 COPY docker/configs/backend-env.sh /app/scripts/backend-env.sh COPY docker/configs/startup.sh /app/scripts/startup.sh COPY docker/configs/logback-spring.xml /app/config/logback-spring.xml COPY docker/configs/application-docker.yml /app/config/application-docker.yml # 设置脚本权限并修改所有者 RUN chmod +x /app/scripts/backend-env.sh /app/scripts/startup.sh && \ chown -R anxin:anxin /app /home/ruoyi # 切换到应用用户 USER anxin # 暴露应用端口 EXPOSE 8080 # 设置环境变量 - 数据库连接配置(默认值,可被docker-compose覆盖) ENV DB_HOST=anxin-mysql \ DB_PORT=3306 \ DB_NAME=anxin_prod \ DB_USER=anxin_prod \ DB_PASSWORD=prod_password # 设置环境变量 - 应用端口和网络配置 ENV SERVER_PORT=8080 \ SPRING_PROFILES_ACTIVE=docker # 设置环境变量 - 日志和监控配置 ENV LOG_LEVEL=INFO \ LOG_PATH=/app/logs \ LOG_MAX_SIZE=100MB \ LOG_MAX_FILES=10 \ MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE=health,info,metrics # 设置环境变量 - JVM和性能配置 ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker" \ TZ=Asia/Shanghai # 健康检查 - 使用配置的端口 HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:${SERVER_PORT}/actuator/health || exit 1 # 启动应用 - 使用启动脚本 ENTRYPOINT ["/app/scripts/startup.sh"]