Java项目Docker构建提速的关键是分层缓存复用:先单独复制pom.xml并下载依赖,再复制源码;用.dockerignore排除target等干扰文件;采用多阶段构建分离编译与运行环境。

Java 项目在 Docker 构建中提速的关键,是让依赖下载和编译环节尽可能复用缓存。Docker 的层缓存机制只在指令内容和输入文件完全一致时才命中,所以不能靠运气,而要按规则组织 Dockerfile。
把 pom.xml 和依赖安装单独成层
这是最核心的一点。Maven 项目的 pom.xml 变动频率远低于 Java 源码。如果先 COPY . . 再 RUN mvn package,哪怕只改一个空格,整个上下文校验失败,后续所有层都会重建。
- 正确做法:先只复制
pom.xml(以及settings.xml等配置文件) - 紧接着运行
RUN mvn dependency:go-offline或RUN mvn install -DskipTests - 这样只要
pom.xml不变,这一步就永远走缓存,通常 1 秒内完成
源码复制必须放在依赖安装之后
业务代码天天改,但不该牵连依赖层。把 COPY src/、COPY resources/ 这类操作严格放在依赖安装指令之后。
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- 例如:在
RUN mvn dependency:go-offline完成后,再COPY src ./src - 这样即使
src/下每天提交十次,前面的依赖层仍能稳定复用 - 避免使用
COPY . .,它会把所有文件一次性带入,极易污染缓存判断
用 .dockerignore 排除干扰文件
Docker 构建时会把当前目录全部打包上传为构建上下文,其中很多文件既不参与构建,又会让缓存频繁失效。
立即学习“Java免费学习笔记(深入)”;
- 必须创建
.dockerignore文件,至少排除:target/、.git/、**/*.class、.idea/、*.log、Dockerfile - 尤其
target/目录,包含已编译 class 和 jar,体积大且内容常变,不忽略会显著拖慢上下文传输和校验 - 排除后,构建上下文更小,缓存判定更干净,也减少敏感信息泄露风险
多阶段构建隔离编译与运行环境
单阶段构建会把 Maven、JDK、.m2 缓存、测试类等全打进最终镜像,不仅体积膨胀,还会因这些无关文件变动导致缓存失效。
- 第一阶段用
FROM maven:3.9-openjdk-17,专注编译:复制pom.xml→ 下载依赖 → 复制src→ 打包 - 第二阶段用
FROM openjdk:17-jre-slim,只COPY --from=builder /src/target/*.jar ./app.jar - 最终镜像里没有
mvn、没有src/、没有pom.xml,自然不会因它们变化而破坏缓存

















