Files
aiot-platform-cloud/docker/Dockerfile.template
lzh 4223c6b8da
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
fix(ci): Docker 构建优化 — 修复 Maven 安装超时、启用 BuildKit、优化层缓存
- Dockerfile.deps/template: 改用阿里云镜像手动安装 Maven,避免 apk maven
  拉入冗余 openjdk25(600MB+)导致构建超时
- Jenkinsfile: 添加 DOCKER_BUILDKIT=1,使层缓存真正生效
- Dockerfile.deps: framework/dependencies 源码在 COPY . . 前单独复制并预编译,
  提升缓存命中率;mvn install 去掉 || true,编译失败立即报错
- .dockerignore: 补充 .git/、docs/、sql/、scripts/ 等目录,构建上下文从
  60MB 降至 ~5MB

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 11:23:44 +08:00

98 lines
3.6 KiB
Docker
Raw 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.4
# ============================================
# 多阶段构建Maven 编译 + 运行时镜像
# 使用 Docker 层缓存加速构建
# ============================================
# ============ 构建阶段 ============
FROM eclipse-temurin:17-jdk-alpine AS builder
# 安装 Maven从阿里云镜像下载避免 apk maven 包拉入冗余 JDK
ARG MAVEN_VERSION=3.9.9
RUN wget -q https://mirrors.aliyun.com/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz -O /tmp/maven.tar.gz \
&& tar xzf /tmp/maven.tar.gz -C /opt \
&& ln -s /opt/apache-maven-${MAVEN_VERSION}/bin/mvn /usr/bin/mvn \
&& rm /tmp/maven.tar.gz
WORKDIR /build
# 构建参数
ARG MODULE_NAME
ARG JAR_NAME
ARG SKIP_TESTS=true
# 复制 pom 文件(利用 Docker 层缓存)
# 先复制 pom再下载依赖这样依赖层可以被缓存
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/
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/
COPY viewsh-module-infra/pom.xml viewsh-module-infra/
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/
COPY viewsh-module-iot/pom.xml viewsh-module-iot/
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/
# 下载依赖(这一层会被缓存,除非 pom 文件变化)
RUN mvn dependency:go-offline -B -q || true
# 复制源代码(代码变化不会影响依赖层的缓存)
COPY . .
# 编译打包
RUN mvn clean package -pl ${MODULE_NAME} -am -DskipTests=${SKIP_TESTS} -B -q
# ============ 运行阶段 ============
FROM eclipse-temurin:17-jre-alpine
# 安装必要工具(用于健康检查)
RUN apk add --no-cache wget curl
# 构建参数
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}"]