135 lines
6.0 KiB
Docker
135 lines
6.0 KiB
Docker
# =============================================
|
|
# TOPIAM Portal - 多阶段构建(简化 Maven 配置)
|
|
# =============================================
|
|
|
|
# ---- 阶段 1: 前端构建 ----
|
|
FROM m.daocloud.io/docker.io/library/node:22.12.0-alpine AS frontend-builder
|
|
|
|
WORKDIR /build/portal-fe
|
|
|
|
# 配置 pnpm 和镜像源
|
|
RUN npm config set registry https://registry.npmmirror.com && \
|
|
npm install -g pnpm@9.15.1
|
|
|
|
# 先复制 package.json 利用缓存
|
|
COPY eiam-portal/src/main/portal-fe/package.json eiam-portal/src/main/portal-fe/pnpm-lock.yaml* ./
|
|
RUN pnpm install --frozen-lockfile --ignore-scripts
|
|
|
|
# 复制源码并构建
|
|
COPY eiam-portal/src/main/portal-fe/ ./
|
|
ENV UMI_ENV=dev
|
|
RUN npm run build:dev
|
|
|
|
|
|
# ---- 阶段 2: 后端构建 ----
|
|
FROM m.daocloud.io/docker.io/library/maven:3.9-eclipse-temurin-17 AS backend-builder
|
|
|
|
WORKDIR /build
|
|
|
|
# 设置 Maven 参数(避免配置文件冲突)
|
|
ENV MAVEN_OPTS="-Xmx2048m -Xms1024m -Djava.awt.headless=true -Dmaven.multiModuleProjectDirectory=/build"
|
|
|
|
# 复制父 pom 和所有模块 pom
|
|
COPY pom.xml .
|
|
COPY eiam-common/pom.xml eiam-common/pom.xml
|
|
COPY eiam-core/pom.xml eiam-core/pom.xml
|
|
COPY eiam-audit/pom.xml eiam-audit/pom.xml
|
|
COPY eiam-application/pom.xml eiam-application/pom.xml
|
|
COPY eiam-application/eiam-application-core/pom.xml eiam-application/eiam-application-core/pom.xml
|
|
COPY eiam-application/eiam-application-oidc/pom.xml eiam-application/eiam-application-oidc/pom.xml
|
|
COPY eiam-application/eiam-application-jwt/pom.xml eiam-application/eiam-application-jwt/pom.xml
|
|
COPY eiam-application/eiam-application-form/pom.xml eiam-application/eiam-application-form/pom.xml
|
|
COPY eiam-application/eiam-application-all/pom.xml eiam-application/eiam-application-all/pom.xml
|
|
COPY eiam-protocol/pom.xml eiam-protocol/pom.xml
|
|
COPY eiam-protocol/eiam-protocol-core/pom.xml eiam-protocol/eiam-protocol-core/pom.xml
|
|
COPY eiam-protocol/eiam-protocol-form/pom.xml eiam-protocol/eiam-protocol-form/pom.xml
|
|
COPY eiam-protocol/eiam-protocol-jwt/pom.xml eiam-protocol/eiam-protocol-jwt/pom.xml
|
|
COPY eiam-protocol/eiam-protocol-oidc/pom.xml eiam-protocol/eiam-protocol-oidc/pom.xml
|
|
COPY eiam-protocol/eiam-protocol-all/pom.xml eiam-protocol/eiam-protocol-all/pom.xml
|
|
COPY eiam-authentication/pom.xml eiam-authentication/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-core/pom.xml eiam-authentication/eiam-authentication-core/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-dingtalk/pom.xml eiam-authentication/eiam-authentication-dingtalk/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-feishu/pom.xml eiam-authentication/eiam-authentication-feishu/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-qq/pom.xml eiam-authentication/eiam-authentication-qq/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-wechat/pom.xml eiam-authentication/eiam-authentication-wechat/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-github/pom.xml eiam-authentication/eiam-authentication-github/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-wechatwork/pom.xml eiam-authentication/eiam-authentication-wechatwork/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-gitee/pom.xml eiam-authentication/eiam-authentication-gitee/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-alipay/pom.xml eiam-authentication/eiam-authentication-alipay/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-sms/pom.xml eiam-authentication/eiam-authentication-sms/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-mail/pom.xml eiam-authentication/eiam-authentication-mail/pom.xml
|
|
COPY eiam-authentication/eiam-authentication-all/pom.xml eiam-authentication/eiam-authentication-all/pom.xml
|
|
COPY eiam-console/pom.xml eiam-console/pom.xml
|
|
COPY eiam-openapi/pom.xml eiam-openapi/pom.xml
|
|
COPY eiam-portal/pom.xml eiam-portal/pom.xml
|
|
COPY eiam-identity-source/pom.xml eiam-identity-source/pom.xml
|
|
COPY eiam-identity-source/eiam-identity-source-core/pom.xml eiam-identity-source/eiam-identity-source-core/pom.xml
|
|
COPY eiam-identity-source/eiam-identity-source-dingtalk/pom.xml eiam-identity-source/eiam-identity-source-dingtalk/pom.xml
|
|
COPY eiam-identity-source/eiam-identity-source-feishu/pom.xml eiam-identity-source/eiam-identity-source-feishu/pom.xml
|
|
COPY eiam-identity-source/eiam-identity-source-all/pom.xml eiam-identity-source/eiam-identity-source-all/pom.xml
|
|
COPY eiam-synchronizer/pom.xml eiam-synchronizer/pom.xml
|
|
|
|
# 下载依赖(离线模式)
|
|
RUN mvn dependency:go-offline -B -pl eiam-portal -am
|
|
|
|
# 复制前端构建产物
|
|
COPY --from=frontend-builder /build/portal-fe/build eiam-portal/src/main/portal-fe/build
|
|
|
|
# 复制后端源码并编译打包
|
|
COPY eiam-common eiam-common
|
|
COPY eiam-core eiam-core
|
|
COPY eiam-audit eiam-audit
|
|
COPY eiam-application eiam-application
|
|
COPY eiam-protocol eiam-protocol
|
|
COPY eiam-authentication eiam-authentication
|
|
COPY eiam-portal/src eiam-portal/src
|
|
|
|
RUN mvn clean package -pl eiam-portal -am -P!dev -DskipTests -Dlicense.skip=true -Dformatter.skip=true -Dmaven.javadoc.skip=true
|
|
|
|
|
|
# ---- 阶段 3: 运行时镜像 ----
|
|
FROM eclipse-temurin:17-jre-alpine
|
|
|
|
# 安装基础工具
|
|
RUN apk add --no-cache \
|
|
tzdata \
|
|
fontconfig \
|
|
curl \
|
|
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
|
|
&& echo "Asia/Shanghai" > /etc/timezone
|
|
|
|
# 创建非 root 用户
|
|
RUN addgroup -g 1000 -S topiam && \
|
|
adduser -u 1000 -S -G topiam topiam
|
|
|
|
WORKDIR /app
|
|
|
|
# 复制 jar 包
|
|
COPY --from=backend-builder /build/eiam-portal/target/topiam-employee-portal-*.jar app.jar
|
|
|
|
# 修改文件所有者
|
|
RUN chown -R topiam:topiam /app
|
|
|
|
# 切换非 root 用户
|
|
USER topiam
|
|
|
|
# 暴露端口
|
|
EXPOSE 1989
|
|
|
|
# JVM 参数优化
|
|
ENV JAVA_OPTS="-Xms512m -Xmx1024m \
|
|
-XX:+UseG1GC \
|
|
-XX:MaxGCPauseMillis=200 \
|
|
-XX:+HeapDumpOnOutOfMemoryError \
|
|
-XX:HeapDumpPath=/app/heapdump.hprof \
|
|
-Djava.security.egd=file:/dev/./urandom \
|
|
-Dfile.encoding=UTF-8 \
|
|
-Duser.timezone=Asia/Shanghai"
|
|
|
|
# 健康检查
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
|
CMD curl -f http://localhost:1989/actuator/health || exit 1
|
|
|
|
# 启动入口
|
|
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Dspring.profiles.active=remote -jar app.jar"]
|