102 lines
2.8 KiB
Docker
102 lines
2.8 KiB
Docker
# 多阶段构建:第一阶段用于构建 API 应用程序
|
|
FROM gradle:8.10-jdk21-alpine AS api-builder
|
|
|
|
# 设置工作目录
|
|
WORKDIR /app
|
|
|
|
# 将 API 项目的所有文件拷贝到容器中
|
|
COPY ./api .
|
|
|
|
# 使用 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
|
|
|
|
# 第三阶段:构建 Web 前端
|
|
FROM node:21 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
|
|
|
|
# 将 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 \
|
|
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 \
|
|
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)"; \
|
|
exit 1; \
|
|
fi \
|
|
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*;
|
|
|
|
# 拷贝定制化的 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 ./nginx.conf /etc/nginx/nginx.conf
|
|
|
|
# 暴露服务端口
|
|
EXPOSE 80
|
|
|
|
# 启动服务
|
|
CMD ["/bin/sh", "./entrypoint.sh"]
|