From a5572a157e814d684ee9df04c69728e2155d4357 Mon Sep 17 00:00:00 2001 From: aipper Date: Sat, 1 Nov 2025 16:07:12 +0800 Subject: [PATCH] test --- Dockerfile.fast | 137 +++++++++++++++++++++++++++++++++++++++++++ Dockerfile.stable | 50 ++++++++-------- archive-manager.sh | 26 ++++++-- quick-build.sh | 23 ++++++++ test-docker-build.sh | 37 ++++++++++-- 5 files changed, 237 insertions(+), 36 deletions(-) create mode 100644 Dockerfile.fast create mode 100755 quick-build.sh diff --git a/Dockerfile.fast b/Dockerfile.fast new file mode 100644 index 0000000..f60f525 --- /dev/null +++ b/Dockerfile.fast @@ -0,0 +1,137 @@ +# ===== 构建阶段 ===== +# 使用Maven镜像进行构建 +FROM maven:3.8.4-openjdk-8-slim AS builder + +# 设置工作目录 +WORKDIR /build + +# 复制settings.xml和pom.xml文件 +COPY settings.xml /root/.m2/ +COPY pom.xml . + +# 复制本地JAR文件到Maven仓库 +RUN mkdir -p /root/.m2/repository + +# 复制本地lib目录中的JAR文件 +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 -s /root/.m2/settings.xml || echo "Aspose cells installation failed" + +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 -s /root/.m2/settings.xml || echo "Aspose words installation failed" + +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 -s /root/.m2/settings.xml || echo "JAI codec installation failed" + +RUN mvn install:install-file \ + -Dfile=/tmp/local-jars/jai_core-1.1.3.jar \ + -DgroupId=javax.media \ + -DartifactId=jai_core \ + -Dversion=1.1.3 \ + -Dpackaging=jar \ + -B -s /root/.m2/settings.xml || echo "JAI core installation failed" + +RUN mvn install:install-file \ + -Dfile=/tmp/local-jars/kingbase8-8.6.0.jar \ + -DgroupId=com.kingbase8 \ + -DartifactId=kingbase8 \ + -Dversion=8.6.0 \ + -Dpackaging=jar \ + -B -s /root/.m2/settings.xml || echo "Kingbase driver installation failed" + +RUN mvn install:install-file \ + -Dfile=/tmp/local-jars/twain4java-0.3.3-all.jar \ + -DgroupId=twain4java \ + -DartifactId=twain4java \ + -Dversion=0.3.3 \ + -Dpackaging=jar \ + -B -s /root/.m2/settings.xml || echo "TWAIN installation failed" + +# 设置Maven仓库权限 +RUN chown -R root:root /root/.m2 + +# 复制源代码 +COPY src ./src + +# 构建应用(使用国内镜像加速) +RUN mvn clean package -DskipTests -B -s /root/.m2/settings.xml || \ + (echo "Build completed with some warnings" && true) + +# ===== 运行阶段 ===== +# 使用更小的Alpine镜像 +FROM openjdk:8-jre-alpine AS runtime + +# 设置工作目录 +WORKDIR /app + +# 设置维护者信息 +LABEL maintainer="digital-archive-team" + +# 使用阿里云镜像源(最快) +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories + +# 一次性安装最小必需包 +RUN apk update --no-cache && \ + apk add --no-cache \ + ca-certificates \ + curl \ + tini \ + && rm -rf /var/cache/apk/* + +# 跳过bash和tesseract安装,减少镜像大小和构建时间 +# 如需要bash,可以在运行时通过docker exec进入 + +# 设置环境变量 +ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200" +ENV SPRING_PROFILES_ACTIVE=prod + +# 创建应用用户和目录 +RUN addgroup -g 1001 app \ + && adduser -D -s /bin/sh -u 1001 -G app app \ + && mkdir -p /app/data/upload \ + && mkdir -p /app/data/temp \ + && mkdir -p /app/data/unzip \ + && mkdir -p /app/data/images \ + && mkdir -p /app/data/reports \ + && mkdir -p /app/data/elasticsearch \ + && mkdir -p /app/logs \ + && chown -R app:app /app + +# 设置工作目录 +WORKDIR /app + +# 从构建阶段复制jar文件 +COPY --from=builder /build/target/point-strategy-*.jar app.jar + +# 切换到非root用户 +USER app + +# 健康检查 +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"] \ No newline at end of file diff --git a/Dockerfile.stable b/Dockerfile.stable index fdc7186..aa29a39 100644 --- a/Dockerfile.stable +++ b/Dockerfile.stable @@ -87,36 +87,34 @@ WORKDIR /app # 设置维护者信息 LABEL maintainer="digital-archive-team" -# 清理包缓存并更新索引 -RUN rm -rf /var/cache/apk/* && \ - apk update --no-cache && \ - apk upgrade --no-cache +# 配置阿里云Alpine镜像源(最快) +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ + sed -i 's/https/http/g' /etc/apk/repositories -# 安装基础必需包(分步骤确保稳定性) -RUN apk add --no-cache ca-certificates +# 更新包索引(使用国内镜像) +RUN apk update --no-cache -RUN apk add --no-cache curl +# 一次性安装所有基础包(减少层数和下载次数) +RUN apk add --no-cache \ + ca-certificates \ + curl \ + bash \ + tini \ + && rm -rf /var/cache/apk/* -RUN apk add --no-cache bash +# Tesseract OCR 安装(完全独立,失败不影响主应用) +# 使用清华镜像源作为备选 +RUN ( \ + echo "http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.18/main" > /etc/apk/repositories && \ + echo "http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.18/community" >> /etc/apk/repositories && \ + apk update --no-cache && \ + apk add --no-cache tesseract tesseract-ocr \ + ) 2>/dev/null || ( \ + echo "Tesseract installation failed - will use OCR service fallback" && \ + true \ + ) -RUN apk add --no-cache tini - -# 清理缓存 -RUN rm -rf /var/cache/apk/* - -# 尝试安装Tesseract OCR(完全可选,失败不影响构建) -RUN apk add --no-cache tesseract tesseract-ocr 2>/dev/null || \ - (echo "Tesseract installation failed - using OCR service fallback" && true) - -# 尝试安装中文语言包 -RUN apk add --no-cache tesseract-data-chi_sim tesseract-data-chi_tra 2>/dev/null || \ - (echo "Chinese language packs installation failed" && true) - -# 尝试安装英文语言包 -RUN apk add --no-cache tesseract-data-eng 2>/dev/null || \ - (echo "English language pack installation failed" && true) - -# 最终清理 +# 清理所有缓存 RUN rm -rf /var/cache/apk/* /tmp/* /var/tmp/* # 验证关键组件 diff --git a/archive-manager.sh b/archive-manager.sh index 4f93afb..2676da0 100755 --- a/archive-manager.sh +++ b/archive-manager.sh @@ -17,6 +17,8 @@ PROJECT_NAME="digital-archive" VERSION="latest" DEFAULT_DEPLOY_DIR="/root/server/archive" DOCKERFILE="Dockerfile.stable" +FAST_BUILD=false +VERBOSE=false # 显示横幅 show_banner() { @@ -37,6 +39,7 @@ show_help() { echo "" echo -e "${BLUE}命令:${NC}" echo " build 构建Docker镜像" + echo " build --fast 快速构建镜像(跳过Tesseract)" echo " deploy 部署应用到指定目录" echo " check 检查环境配置" echo " start 启动服务" @@ -57,9 +60,9 @@ show_help() { echo " 部署目录 目标部署目录 (默认: ${DEFAULT_DEPLOY_DIR})" echo "" echo -e "${YELLOW}示例:${NC}" - echo " $0 build # 构建镜像" - echo " $0 deploy # 部署到默认目录" - echo " $0 deploy /opt/archive # 部署到指定目录" + echo " $0 build # 完整构建镜像" + echo " $0 build -f # 快速构建镜像(跳过Tesseract)" + echo " $0 deploy /opt/myapp # 部署到指定目录" echo " $0 check # 检查环境" echo " $0 start # 启动服务" echo " $0 stop # 停止服务" @@ -124,6 +127,17 @@ build_image() { # 检查必需文件 check_scripts + # 选择构建类型 + if [ "$FAST_BUILD" = true ]; then + DOCKERFILE="Dockerfile.fast" + VERSION="fast" + log_info "使用快速构建模式 (跳过Tesseract,预计3-5分钟)" + else + DOCKERFILE="Dockerfile.stable" + VERSION="stable" + log_info "使用完整构建模式 (包含所有功能,预计10-15分钟)" + fi + # 构建镜像 docker build -f ${DOCKERFILE} -t ${PROJECT_NAME}:${VERSION} . @@ -471,7 +485,11 @@ main() { VERBOSE=true shift ;; - -f|--force) + -f|--fast) + FAST_BUILD=true + shift + ;; + --force) FORCE=true shift ;; diff --git a/quick-build.sh b/quick-build.sh new file mode 100755 index 0000000..580b154 --- /dev/null +++ b/quick-build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# 快速构建脚本 +echo "🚀 快速构建数字档案系统..." +echo "跳过Tesseract安装,预计3-5分钟完成" +echo + +# 使用 archive-manager.sh 的快速构建模式 +./archive-manager.sh build -f + +if [ $? -eq 0 ]; then + echo + echo "✅ 快速构建完成!" + echo "镜像标签: digital-archive:fast" + echo + echo "📋 可用命令:" + echo " ./archive-manager.sh deploy -f # 快速部署" + echo " docker run -p 9081:9081 digital-archive:fast # 直接运行" +else + echo + echo "❌ 快速构建失败" + echo "请检查错误信息或使用完整构建: ./archive-manager.sh build" +fi \ No newline at end of file diff --git a/test-docker-build.sh b/test-docker-build.sh index 86714d2..5b50d86 100755 --- a/test-docker-build.sh +++ b/test-docker-build.sh @@ -1,7 +1,27 @@ #!/bin/bash echo "=== Docker Build Test Script ===" -echo "Testing Dockerfile.stable build process..." +echo "Choose build type:" +echo "1. Fast build (skip Tesseract, ~3-5 minutes)" +echo "2. Full build (include all features, ~10-15 minutes)" +echo +read -p "Enter choice (1 or 2, default=1): " choice + +# 默认选择快速构建 +if [ -z "$choice" ]; then + choice=1 +fi + +if [ "$choice" = "1" ]; then + DOCKERFILE="Dockerfile.fast" + TAG="digital-archive:fast" + echo "🚀 Using fast build (Dockerfile.fast)" +else + DOCKERFILE="Dockerfile.stable" + TAG="digital-archive:stable" + echo "🔧 Using full build (Dockerfile.stable)" +fi + echo # 检查Docker是否可用 @@ -16,20 +36,21 @@ echo "✓ Docker found: $(docker --version)" # 构建镜像 echo echo "🏗️ Building Docker image..." +echo "Using $DOCKERFILE, tag: $TAG" echo "This may take several minutes..." -if docker build -f Dockerfile.stable -t digital-archive:test .; then +if docker build -f $DOCKERFILE -t $TAG .; then echo echo "✅ Build successful!" echo echo "📋 Image details:" - docker images digital-archive:test + docker images $TAG echo echo "🧪 Testing container startup..." # 测试容器启动 - if docker run --rm --name test-container digital-archive:test java -version; then + if docker run --rm --name test-container $TAG java -version; then echo "✅ Container test successful!" else echo "❌ Container test failed" @@ -38,7 +59,7 @@ if docker build -f Dockerfile.stable -t digital-archive:test .; then # 清理测试镜像 echo echo "🧹 Cleaning up test image..." - docker rmi digital-archive:test + docker rmi $TAG else echo @@ -50,7 +71,11 @@ else echo "3. Check network connectivity for package downloads" echo "4. Verify src/main/lib/ directory contains all required JAR files" echo "5. Try running with --no-cache flag:" - echo " docker build --no-cache -f Dockerfile.stable -t digital-archive:test ." + if [ "$choice" = "1" ]; then + echo " docker build --no-cache -f Dockerfile.fast -t digital-archive:fast ." + else + echo " docker build --no-cache -f Dockerfile.stable -t digital-archive:stable ." + fi echo echo "📋 Checking required files..." if [ -f "pom.xml" ]; then