216 lines
7.0 KiB
Docker
216 lines
7.0 KiB
Docker
# ===== 基础镜像阶段 =====
|
||
# 使用更小的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"]
|