Files
topiam/eiam-console/Dockerfile
T
cuijiawang cce9fab2e4 mod
2026-09-22 19:42:05 +08:00

137 lines
6.2 KiB
Docker

# =============================================
# TOPIAM Console - 多阶段构建(简化 Maven 配置)
# =============================================
# ---- 阶段 1: 前端构建 ----
FROM m.daocloud.io/docker.io/library/node:22.12.0-alpine AS frontend-builder
WORKDIR /build/console-fe
# 配置 pnpm 和镜像源
RUN npm config set registry https://registry.npmmirror.com && \
npm install -g pnpm@9.15.1
# 先复制 package.json 利用缓存
COPY eiam-console/src/main/console-fe/package.json eiam-console/src/main/console-fe/pnpm-lock.yaml* ./
RUN pnpm install --frozen-lockfile --ignore-scripts
# 复制源码并构建
COPY eiam-console/src/main/console-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(父 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-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
COPY eiam-portal/pom.xml eiam-portal/pom.xml
COPY eiam-openapi/pom.xml eiam-openapi/pom.xml
COPY eiam-console/pom.xml eiam-console/pom.xml
# 下载依赖(离线模式)
RUN mvn dependency:go-offline -B -pl eiam-console -am
# 复制前端构建产物
COPY --from=frontend-builder /build/console-fe/build eiam-console/src/main/console-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-identity-source eiam-identity-source
COPY eiam-synchronizer eiam-synchronizer
COPY eiam-console/src eiam-console/src
RUN mvn package -pl eiam-console -am -P!dev -DskipTests -Dlicense.skip=true -Dformatter.skip=true -Dmaven.javadoc.skip=true
# ---- 阶段 3: 运行时镜像 ----
FROM eclipse-temurin:17-jre-alpine
# 安装基础工具:字体、时区、curl(健康检查用)
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-console/target/topiam-employee-console-*.jar app.jar
# 修改文件所有者
RUN chown -R topiam:topiam /app
# 切换非 root 用户
USER topiam
# 暴露端口
EXPOSE 1898
# 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:1898/actuator/health || exit 1
# 启动入口
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Dspring.profiles.active=remote -jar app.jar"]