From e1c2105501f294fc8f587d2353bb9c33eb8dbf77 Mon Sep 17 00:00:00 2001 From: jarvis2f <137974272+jarvis2f@users.noreply.github.com> Date: Fri, 10 Jan 2025 21:38:56 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=B7=20chore:=20Update=20entrypoint.sh?= =?UTF-8?q?=20and=20Dockerfile=20to=20improve=20service=20startup=20and=20?= =?UTF-8?q?environment=20configuration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 108 +++++++++++++++++++++++--------------------------- entrypoint.sh | 44 +++++++++----------- 2 files changed, 67 insertions(+), 85 deletions(-) diff --git a/Dockerfile b/Dockerfile index ca284ef..0cac9cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,102 +1,92 @@ -# 多阶段构建:第一阶段用于构建 API 应用程序 FROM gradle:8.10-jdk21-alpine AS api-builder -# 设置工作目录 WORKDIR /app -# 将 API 项目的所有文件拷贝到容器中 +COPY ./api/build.gradle ./api/settings.gradle ./ +COPY ./api/gradle ./gradle +RUN gradle dependencies --no-daemon + COPY ./api . +RUN gradle shadowJar --no-daemon && \ + mkdir -p /app/build/libs && \ + cp /app/build/libs/*.jar /app/api.jar && \ + jdeps --print-module-deps --ignore-missing-deps /app/api.jar > /app/dependencies.txt -# 使用 Gradle 构建项目 -RUN gradle shadowJar --no-daemon - -# 提取构建的 jar 文件 -RUN mkdir -p /app/build/libs && \ - cp /app/build/libs/*.jar /app/api.jar - -# 使用 jdeps 分析依赖 -RUN jdeps --print-module-deps --ignore-missing-deps /app/api.jar > /app/dependencies.txt - -# 第二阶段:创建定制化的 JRE FROM openjdk:21-jdk-slim AS runtime-builder -# 设置工作目录 WORKDIR /custom-jre -# 通过 jlink 创建最小化的 JRE -COPY --from=api-builder /app/dependencies.txt /custom-jre/dependencies.txt -RUN apt-get update && apt-get install binutils -y && \ - jlink \ - --add-modules $(cat /custom-jre/dependencies.txt) \ - --output /custom-jre/jre \ - --strip-debug \ - --no-man-pages \ - --no-header-files \ - --compress=2 +COPY --from=api-builder /app/dependencies.txt . +RUN apt-get update && \ + apt-get install -y --no-install-recommends binutils && \ + jlink \ + --add-modules $(cat dependencies.txt) \ + --output jre \ + --strip-debug \ + --no-man-pages \ + --no-header-files \ + --compress=2 && \ + apt-get purge -y binutils && \ + apt-get autoremove -y && \ + rm -rf /var/lib/apt/lists/* -# 第三阶段:构建 Web 前端 -FROM node:21 AS web-builder +FROM node:21-alpine AS web-builder -ENV NEXT_PUBLIC_API_URL=/api -ENV NEXT_PUBLIC_WS_URL=/ws -ENV NEXT_TELEMETRY_DISABLED=1 -ENV SKIP_ENV_VALIDATION=1 - -# 设置工作目录 WORKDIR /web -# 安装依赖 -COPY ./web/package.json ./web/package-lock.json ./ -RUN npm install --frozen-lockfile +ENV NEXT_PUBLIC_API_URL=/api \ + NEXT_PUBLIC_WS_URL=/ws \ + NEXT_TELEMETRY_DISABLED=1 \ + SKIP_ENV_VALIDATION=1 + +COPY ./web/package*.json ./ +RUN npm ci --frozen-lockfile -# 将 Web 项目的所有文件拷贝到容器中 COPY ./web . - -# 构建 Next.js 应用 RUN npm run build -# 第四阶段:最终运行镜像 FROM node:21-slim AS final WORKDIR /app -RUN npm install pm2 -g \ - && apt-get update && apt-get install -y --no-install-recommends nginx wget curl unzip \ - && if [ "$(uname -m)" = "x86_64" ]; then \ +ARG LIB_PATH=/app/tdlib +ENV JAVA_HOME=/jre \ + PATH="/jre/bin:$PATH" + +RUN npm install -g pm2 && \ + apt-get update && \ + apt-get install -y --no-install-recommends nginx wget curl unzip tini && \ + mkdir -p $LIB_PATH && \ + wget --no-check-certificate -q -O libs.zip https://github.com/p-vorobyev/spring-boot-starter-telegram/releases/download/1.15.0/libs.zip && \ + unzip -q libs.zip -d /tmp/tdlib && \ + if [ "$(uname -m)" = "x86_64" ]; then \ + mv /tmp/tdlib/libs/linux_x64/* $LIB_PATH && \ wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb && \ dpkg -i libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb && \ rm libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb; \ elif [ "$(uname -m)" = "aarch64" ]; then \ + mv /tmp/tdlib/libs/linux_arm64/* $LIB_PATH && \ wget http://ports.ubuntu.com/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_arm64.deb && \ dpkg -i libssl1.1_1.1.1f-1ubuntu2_arm64.deb && \ rm libssl1.1_1.1.1f-1ubuntu2_arm64.deb; \ else \ - echo "Unsupported architecture: $(uname -m)"; \ + echo "Unsupported architecture: $(uname -m)" && \ exit 1; \ - fi \ - && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*; + fi && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ./libs.zip -# 拷贝定制化的 JRE COPY --from=runtime-builder /custom-jre/jre /jre - -# 设置环境变量 -ENV JAVA_HOME=/jre -ENV PATH="$JAVA_HOME/bin:$PATH" - -# 拷贝 API 应用程序 COPY --from=api-builder /app/api.jar /app/api.jar - -# 拷贝 Web 前端静态文件到 nginx COPY --from=web-builder /web/public /app/web/public COPY --from=web-builder /web/.next/standalone /app/web/ COPY --from=web-builder /web/.next/static /app/web/.next/static -COPY ./web/pm2.json /app/web/pm2.json -COPY ./entrypoint.sh ./entrypoint.sh +COPY ./web/pm2.json /app/web/ +COPY ./entrypoint.sh . COPY ./nginx.conf /etc/nginx/nginx.conf -# 暴露服务端口 EXPOSE 80 -# 启动服务 +ENTRYPOINT ["/usr/bin/tini", "--"] CMD ["/bin/sh", "./entrypoint.sh"] diff --git a/entrypoint.sh b/entrypoint.sh index f69183c..93af1f7 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,32 +1,24 @@ #!/bin/bash -lib_path="/app/tdlib" -if [ ! -d "$lib_path" ]; then - echo "Downloading TDLib..." - mkdir -p $lib_path - wget --no-check-certificate -q -O libs.zip https://github.com/p-vorobyev/spring-boot-starter-telegram/releases/download/1.15.0/libs.zip - unzip -q libs.zip -d $lib_path - rm libs.zip -fi +on_terminate() { + echo "Caught termination signal. Shutting down processes..." + kill -TERM "$JAVA_PID" 2>/dev/null + kill -TERM "$PM2_PID" 2>/dev/null + kill -TERM "$NGINX_PID" 2>/dev/null + wait + echo "All processes have been terminated." + exit 0 +} -# libs has linux_arm64 linux_x64 -case $(uname -m) in - x86_64) - lib_path="$lib_path/libs/linux_x64" - ;; - aarch64) - lib_path="$lib_path/libs/linux_arm64" - ;; - *) - echo "Unsupported architecture: $(uname -m)" - exit 1 - ;; -esac +trap 'on_terminate' 15 2 -echo "Using TDLib from $lib_path" +java -jar -Djava.library.path=/app/tdlib /app/api.jar & +JAVA_PID=$! -# start services -java -jar -Djava.library.path=$lib_path /app/api.jar \ - & pm2 start /app/web/pm2.json --no-daemon \ - & nginx -g 'daemon off;' +pm2 start /app/web/pm2.json --no-daemon --silent & +PM2_PID=$! +nginx -g 'daemon off;' & +NGINX_PID=$! + +wait