Files
server/Dockerfile

216 lines
7.0 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ===== 基础镜像阶段 =====
# 使用更小的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"]