Files
par/par-api/Dockerfile

110 lines
3.9 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.

# syntax=docker/dockerfile:1
# PAR Server - 前后端一体化 Docker 镜像(完整多阶段构建)
# 参考 mediabot 的多阶段构建方式,适用于本地独立构建(不依赖 Drone CI 预编译)
# CI 流水线请使用项目根目录的 Dockerfile(精简版,仅打包 drone 预编译产物)
# 启用 BuildKit 以支持 cache mount
# 第一阶段:构建前端
FROM 192.168.31.253/library/node:22-alpine AS web-builder
WORKDIR /app
COPY web/package.json web/package-lock.json ./
RUN --mount=type=cache,target=/root/.npm \
npm ci --ignore-scripts
COPY web/ .
RUN --mount=type=cache,target=/root/.npm \
npm run build
# 第二阶段:构建后端
# mediabot 使用 maven-java21 镜像(已含 JDK + Maven)
FROM 192.168.31.253/library/maven-java21:3.9.9-alpine AS server-builder
WORKDIR /build
# 先复制 pom 文件,利用 Docker 缓存
COPY pom.xml .
COPY par-common/pom.xml par-common/
COPY par-core/pom.xml par-core/
COPY par-api/pom.xml par-api/
# 下载依赖(使用 cache mount 缓存 Maven 仓库)
RUN --mount=type=cache,target=/root/.m2,sharing=locked \
mvn dependency:go-offline -B
# 复制源码并构建
COPY par-common/src par-common/src
COPY par-core/src par-core/src
COPY par-api/src par-api/src
# 将前端构建产物复制到后端静态资源目录
COPY --from=web-builder /app/dist par-api/src/main/resources/static
# 打包(使用 cache mount 缓存 Maven 仓库)
RUN --mount=type=cache,target=/root/.m2,sharing=locked \
mvn clean package -DskipTests -B && \
mkdir -p target && \
cp par-api/target/*.jar target/app.jar
# 第三阶段:运行
FROM 192.168.31.253/library/eclipse-temurin:21-jre-alpine
ARG VERSION=unknown
ARG BUILD_TIME=unknown
# OCI 标准镜像标签(参考 mediabot)
LABEL org.opencontainers.image.source="https://github.com/yescent/par"
LABEL org.opencontainers.image.title="PAR Server"
LABEL org.opencontainers.image.description="PT Adapter Registry Server - 适配器配置注册中心"
LABEL org.opencontainers.image.version="${VERSION}"
LABEL org.opencontainers.image.created="${BUILD_TIME}"
# 运行时环境变量(参考 mediabot:注入版本信息方便运行时查看)
ENV TZ="Asia/Shanghai" \
APP_VERSION="${VERSION}" \
APP_BUILD_TIME="${BUILD_TIME}"
# 创建非 root 用户
RUN addgroup -S par && adduser -S par -G par
WORKDIR /app
# 创建运行时目录
RUN mkdir -p /app/data /app/logs /app/static/configs && \
chown -R par:par /app
# 复制构建产物
COPY --from=server-builder /build/target/app.jar app.jar
USER par
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \
CMD wget -qO- http://localhost:8080/health || exit 1
# 启动入口(兼容 DB_* 和 MYSQL_* 两种变量命名风格)
# Spring Boot 会优先读取 SPRING_DATASOURCE_* 环境变量,覆盖 application.yml 配置
ENTRYPOINT ["sh", "-c", "\
# 如果未设置完整的 SPRING_DATASOURCE_URL,则从环境变量构造\n\
if [ -z \"$SPRING_DATASOURCE_URL\" ]; then \n\
HOST=\"${MYSQL_HOST:-${DB_HOST:-localhost}}\"; \n\
PORT=\"${MYSQL_PORT:-${DB_PORT:-3306}}\"; \n\
DB=\"${MYSQL_DB:-${DB_NAME:-par_registry}}\"; \n\
export SPRING_DATASOURCE_URL=\"jdbc:mysql://${HOST}:${PORT}/${DB}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8\"; \n\
fi; \n\
# 用户名密码:MYSQL_* 优先,DB_* 作为备选\n\
if [ -z \"$SPRING_DATASOURCE_USERNAME\" ]; then \n\
export SPRING_DATASOURCE_USERNAME=\"${MYSQL_USER:-${DB_USERNAME:-root}}\"; \n\
fi; \n\
if [ -z \"$SPRING_DATASOURCE_PASSWORD\" ]; then \n\
export SPRING_DATASOURCE_PASSWORD=\"${MYSQL_PASSWORD:-${DB_PASSWORD:-}}\"; \n\
fi; \n\
# 兼容 JWT_SECRET 和 HMAC_SECRET 两种命名\n\
if [ -z \"$HMAC_SECRET\" ] && [ -n \"$JWT_SECRET\" ]; then \n\
export HMAC_SECRET=\"$JWT_SECRET\"; \n\
fi; \n\
java $JAVA_OPTS -jar app.jar \n\
"]