# ===== 基础镜像阶段 ===== # 使用更小的Alpine OpenJRE镜像 FROM docker.aipper.de/eclipse-temurin:8-jre-alpine AS base # 设置维护者信息 LABEL maintainer="digital-archive-team" # 使用阿里云镜像源并安装基础包(包含OCR和字体支持) RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ apk add --no-cache \ ca-certificates \ curl \ bash \ # 基础字体包 ttf-dejavu \ # 中文字体支持包 ttf-freefont \ ttf-liberation \ ttf-inconsolata \ # 字体配置工具 fontconfig \ tini \ # OCR相关包 tesseract-ocr \ tesseract-ocr-data-chi_sim \ tesseract-ocr-data-eng \ && rm -rf /var/cache/apk/* # 备用字体安装(如果需要更多中文字体支持) RUN echo "Installing additional Chinese fonts..." && \ apk add --no-cache \ # 备用中文字体包 font-adobe-100dpi \ font-adobe-75dpi \ font-alias \ font-util \ || echo "Some font packages not available, continuing with default fonts" # 配置字体支持(从资源目录复制自定义字体) RUN if [ -f "/build/src/main/resources/SIMYOU.TTF" ]; then \ mkdir -p /usr/share/fonts && \ cp /build/src/main/resources/SIMYOU.TTF /usr/share/fonts/ && \ echo "Copied SIMYOU.TTF to fonts directory" && \ fc-cache -fv; \ else \ echo "SIMYOU.TTF not found in resources, using system fonts"; \ fi # 生成字体缓存以确保系统字体正确识别 RUN fc-cache -fv || echo "Font cache generation completed with warnings" # ===== Maven 构建阶段 ===== # 使用更小的Alpine Maven镜像进行构建 FROM docker.aipper.de/maven:3.9.9-eclipse-temurin-8-alpine AS builder # 设置工作目录 WORKDIR /build # 创建Maven仓库并设置权限 RUN mkdir -p /root/.m2/repository && \ chown -R root:root /root/.m2 # 复制settings.xml和pom.xml文件 COPY settings.xml /root/.m2/ COPY pom.xml . # 复制本地lib目录中的JAR文件(现在包含twain4java) COPY src/main/lib/ /tmp/local-jars/ # 手动安装本地JAR到Maven仓库(修复版本一致性和错误处理) RUN mvn install:install-file \ -Dfile=/tmp/local-jars/aspose-cells-8.5.2.jar \ -DgroupId=com.aspose \ -DartifactId=aspose-cells \ -Dversion=8.5.2 \ -Dpackaging=jar \ -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml RUN mvn install:install-file \ -Dfile=/tmp/local-jars/aspose-words-15.8.0-jdk16.jar \ -DgroupId=com.aspose \ -DartifactId=aspose-words \ -Dversion=15.8.0 \ -Dpackaging=jar \ -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml RUN mvn install:install-file \ -Dfile=/tmp/local-jars/jai_codec-1.1.3.jar \ -DgroupId=javax.media \ -DartifactId=jai_codec \ -Dversion=1.1.3 \ -Dpackaging=jar \ -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml RUN mvn install:install-file \ -Dfile=/tmp/local-jars/jai_core.jar \ -DgroupId=javax.media \ -DartifactId=jai_core \ -Dversion=1.0.0-SNAPSHOT \ -Dpackaging=jar \ -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml RUN mvn install:install-file \ -Dfile=/tmp/local-jars/jce-0.0.1.jar \ -DgroupId=org.bouncycastle \ -DartifactId=jce \ -Dversion=0.0.1 \ -Dpackaging=jar \ -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml RUN mvn install:install-file \ -Dfile=/tmp/local-jars/agent-1.0.0.jar \ -DgroupId=com.yh \ -DartifactId=scofd \ -Dversion=1.0.1 \ -Dpackaging=jar \ -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml # 安装twain4java JAR(用于扫描仪功能) RUN mvn install:install-file \ -Dfile=/tmp/local-jars/twain4java-0.3.3-all.jar \ -DgroupId=twain4java \ -DartifactId=twain4java \ -Dversion=0.3.3-all \ -Dpackaging=jar \ -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml # 确保Maven仓库权限正确 RUN chown -R root:root /root/.m2 && \ chmod -R 755 /root/.m2 # 复制源代码 COPY src ./src # 验证依赖和构建环境 RUN echo "=== 验证Maven环境 ===" && \ mvn -version && \ echo "=== 验证本地JAR文件 ===" && \ ls -la /tmp/local-jars/ && \ echo "=== 下载依赖(不编译) ===" && \ mvn dependency:go-offline -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml -e || \ mvn dependency:resolve -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml -e # 构建应用(移除离线模式,允许下载依赖) RUN echo "=== 开始构建应用 ===" && \ mvn clean package -DskipTests -B -gs /root/.m2/settings.xml -s /root/.m2/settings.xml -e \ -Dmaven.test.skip=true \ -Dmaven.compiler.optimize=true \ && \ echo "=== 清理Maven缓存减少镜像大小 ===" && \ rm -rf /root/.m2/repository # 检查构建结果并复制正确的JAR文件 RUN echo "=== 检查构建结果 ===" && \ ls -la /build/target/ && \ echo "=== 查找所有 JAR 文件 ===" && \ find /build/target -name "*.jar" -type f && \ echo "=== 复制正确的 JAR 文件 ===" && \ cp /build/target/*.jar /build/app.jar && \ ls -la /build/app.jar && \ echo "JAR 文件大小: $(du -h /build/app.jar | cut -f1)" && \ echo "=== 清理构建临时文件 ===" && \ rm -rf /build/src /build/pom.xml /build/target /tmp/local-jars # ===== 运行阶段 ===== # 复用基础镜像,避免重复安装依赖 FROM base # 设置环境变量(优化内存使用和字体支持,防止OOM) ENV JAVA_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/dumps/ -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/app/logs/gc.log -Djava.awt.headless=true -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -XX:InitiatingHeapOccupancyPercent=45 -XX:+UseStringDeduplication -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai" ENV SPRING_PROFILES_ACTIVE=prod ENV TESSDATA_PREFIX=/usr/share/tessdata/ ENV OCR_TESSPATH=/usr/bin/tesseract # 字体相关环境变量 ENV JAVA_FONTS=/usr/share/fonts ENV FONTCONFIG_PATH=/etc/fonts # 创建应用用户和目录 RUN addgroup -g 1001 app && \ adduser -D -s /bin/sh -u 1001 -G app app && \ mkdir -p /app/data/upload \ /app/data/temp \ /app/data/unzip \ /app/data/images \ /app/data/reports \ /app/data/elasticsearch \ /app/logs && \ chown -R app:app /app # 设置工作目录 WORKDIR /app # 从构建阶段复制jar文件 COPY --from=builder /build/app.jar app.jar # 验证JAR文件是否正确复制 RUN ls -la app.jar && echo "JAR 文件大小: $(du -h app.jar | cut -f1)" # 切换到非root用户 USER app # 确保日志目录存在且有正确权限 RUN mkdir -p /app/logs # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:9081/point-strategy/actuator/health || exit 1 # 暴露端口 EXPOSE 9081 # 使用tini作为init进程,正确处理信号 ENTRYPOINT ["/sbin/tini", "--"] CMD ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]