2026-01-13 15:36:29 +08:00
|
|
|
|
# syntax=docker/dockerfile:1.4
|
2026-01-13 09:49:19 +08:00
|
|
|
|
|
2026-01-13 15:36:29 +08:00
|
|
|
|
# ============================================
|
|
|
|
|
|
# 多阶段构建:Maven 编译 + 运行时镜像
|
2026-01-13 15:40:37 +08:00
|
|
|
|
# 使用 Docker 层缓存加速构建
|
2026-01-13 15:36:29 +08:00
|
|
|
|
# ============================================
|
2026-01-13 09:49:19 +08:00
|
|
|
|
|
2026-01-13 15:36:29 +08:00
|
|
|
|
# ============ 构建阶段 ============
|
2026-01-13 15:45:57 +08:00
|
|
|
|
FROM eclipse-temurin:17-jdk-alpine AS builder
|
|
|
|
|
|
|
|
|
|
|
|
# 安装 Maven
|
|
|
|
|
|
RUN apk add --no-cache maven
|
2026-01-13 09:49:19 +08:00
|
|
|
|
|
|
|
|
|
|
WORKDIR /build
|
|
|
|
|
|
|
2026-01-13 15:36:29 +08:00
|
|
|
|
# 构建参数
|
|
|
|
|
|
ARG MODULE_NAME
|
|
|
|
|
|
ARG JAR_NAME
|
|
|
|
|
|
ARG SKIP_TESTS=true
|
|
|
|
|
|
|
|
|
|
|
|
# 复制 pom 文件(利用 Docker 层缓存)
|
2026-01-13 15:40:37 +08:00
|
|
|
|
# 先复制 pom,再下载依赖,这样依赖层可以被缓存
|
2026-01-13 09:49:19 +08:00
|
|
|
|
COPY pom.xml .
|
|
|
|
|
|
COPY viewsh-dependencies/pom.xml viewsh-dependencies/
|
|
|
|
|
|
COPY viewsh-framework/pom.xml viewsh-framework/
|
|
|
|
|
|
COPY viewsh-gateway/pom.xml viewsh-gateway/
|
|
|
|
|
|
COPY viewsh-module-system/pom.xml viewsh-module-system/
|
2026-01-13 15:36:29 +08:00
|
|
|
|
COPY viewsh-module-system/viewsh-module-system-api/pom.xml viewsh-module-system/viewsh-module-system-api/
|
|
|
|
|
|
COPY viewsh-module-system/viewsh-module-system-server/pom.xml viewsh-module-system/viewsh-module-system-server/
|
2026-01-13 09:49:19 +08:00
|
|
|
|
COPY viewsh-module-infra/pom.xml viewsh-module-infra/
|
2026-01-13 15:36:29 +08:00
|
|
|
|
COPY viewsh-module-infra/viewsh-module-infra-api/pom.xml viewsh-module-infra/viewsh-module-infra-api/
|
|
|
|
|
|
COPY viewsh-module-infra/viewsh-module-infra-server/pom.xml viewsh-module-infra/viewsh-module-infra-server/
|
2026-01-13 09:49:19 +08:00
|
|
|
|
COPY viewsh-module-iot/pom.xml viewsh-module-iot/
|
2026-01-13 15:36:29 +08:00
|
|
|
|
COPY viewsh-module-iot/viewsh-module-iot-core/pom.xml viewsh-module-iot/viewsh-module-iot-core/
|
|
|
|
|
|
COPY viewsh-module-iot/viewsh-module-iot-api/pom.xml viewsh-module-iot/viewsh-module-iot-api/
|
|
|
|
|
|
COPY viewsh-module-iot/viewsh-module-iot-server/pom.xml viewsh-module-iot/viewsh-module-iot-server/
|
|
|
|
|
|
COPY viewsh-module-iot/viewsh-module-iot-gateway/pom.xml viewsh-module-iot/viewsh-module-iot-gateway/
|
2026-01-13 09:49:19 +08:00
|
|
|
|
|
2026-01-13 15:40:37 +08:00
|
|
|
|
# 下载依赖(这一层会被缓存,除非 pom 文件变化)
|
|
|
|
|
|
RUN mvn dependency:go-offline -B -q || true
|
2026-01-13 09:49:19 +08:00
|
|
|
|
|
2026-01-13 15:40:37 +08:00
|
|
|
|
# 复制源代码(代码变化不会影响依赖层的缓存)
|
2026-01-13 09:49:19 +08:00
|
|
|
|
COPY . .
|
|
|
|
|
|
|
2026-01-13 15:40:37 +08:00
|
|
|
|
# 编译打包
|
|
|
|
|
|
RUN mvn clean package -pl ${MODULE_NAME} -am -DskipTests=${SKIP_TESTS} -B -q
|
2026-01-13 09:49:19 +08:00
|
|
|
|
|
|
|
|
|
|
# ============ 运行阶段 ============
|
|
|
|
|
|
FROM eclipse-temurin:17-jre-alpine
|
|
|
|
|
|
|
2026-01-13 15:36:29 +08:00
|
|
|
|
# 安装必要工具(用于健康检查)
|
|
|
|
|
|
RUN apk add --no-cache wget curl
|
|
|
|
|
|
|
2026-01-13 09:49:19 +08:00
|
|
|
|
# 构建参数
|
|
|
|
|
|
ARG MODULE_NAME
|
|
|
|
|
|
ARG JAR_NAME
|
|
|
|
|
|
ARG APP_PORT=48080
|
|
|
|
|
|
|
|
|
|
|
|
# 元数据标签
|
|
|
|
|
|
LABEL maintainer="XW-AIOT Team"
|
|
|
|
|
|
LABEL service="${MODULE_NAME}"
|
|
|
|
|
|
|
|
|
|
|
|
# 创建非 root 用户
|
|
|
|
|
|
RUN addgroup -g 1000 appuser && \
|
|
|
|
|
|
adduser -D -u 1000 -G appuser appuser
|
|
|
|
|
|
|
|
|
|
|
|
# 创建应用目录
|
|
|
|
|
|
RUN mkdir -p /app/logs /app/config && \
|
|
|
|
|
|
chown -R appuser:appuser /app
|
|
|
|
|
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
|
|
|
|
# 从构建阶段复制 JAR 文件
|
|
|
|
|
|
COPY --from=builder --chown=appuser:appuser /build/${MODULE_NAME}/target/${JAR_NAME}.jar app.jar
|
|
|
|
|
|
|
|
|
|
|
|
# 切换到非 root 用户
|
|
|
|
|
|
USER appuser
|
|
|
|
|
|
|
|
|
|
|
|
# 环境变量
|
|
|
|
|
|
ENV TZ=Asia/Shanghai \
|
|
|
|
|
|
JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs/heap-dump.hprof" \
|
|
|
|
|
|
SPRING_PROFILES_ACTIVE=prod \
|
|
|
|
|
|
APP_ARGS=""
|
|
|
|
|
|
|
|
|
|
|
|
# 暴露端口
|
|
|
|
|
|
EXPOSE ${APP_PORT}
|
|
|
|
|
|
|
|
|
|
|
|
# 健康检查
|
|
|
|
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
|
|
|
|
|
CMD wget --no-verbose --tries=1 --spider http://localhost:${APP_PORT}/actuator/health || exit 1
|
|
|
|
|
|
|
|
|
|
|
|
# 启动应用
|
|
|
|
|
|
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar ${APP_ARGS}"]
|