java项目docker构建提速核心是提升缓存命中率:依赖与代码分层复制、多阶段构建分离编译与运行环境、用.dockerignore排除无关文件、合并run命令并清理中间产物。

把依赖层和代码层严格分离
Maven 项目中,`pom.xml` 变更频率远低于源码。如果 `COPY . .` 放在前面,只要改一行 Java 代码,整个构建就从头开始。正确做法是分两步复制:先只复制 `pom.xml`(及 `settings.xml` 等依赖配置文件)→ 运行 `mvn dependency:go-offline` 或 `mvn install -DskipTests` 下载并缓存依赖 → 再复制 `src/` 和其他业务文件。
这样只要 `pom.xml` 不变,依赖安装步骤就能复用缓存,哪怕 `src/` 每天改十次,也不影响前面的层。用多阶段构建切断编译环境对运行镜像的影响
编译需要 Maven、JDK 全套工具链,但运行只需要 JRE 和打包好的 JAR。单阶段构建会把编译中间产物、测试类、`.m2` 目录等全塞进最终镜像,不仅体积大,还导致缓存极易失效。推荐写法:
- 第一阶段 `FROM maven:3.8-openjdk-17 AS builder`,专注编译打包
- 第二阶段 `FROM openjdk:17-jre-slim`,只 `COPY --from=builder /app/target/*.jar ./app.jar`
- 运行镜像里没有 `mvn`、没有 `src/`、没有 `pom.xml`,自然不会因这些文件变动而破坏缓存
避免 COPY 整个上下文,用 .dockerignore 排除干扰项
`docker build` 默认把当前目录所有文件打包上传为构建上下文。Java 项目常含 `target/`、`.idea/`、`*.log`、`node_modules/`(如果有前端模块)等——它们既不参与构建,又会让 Docker 计算校验和时反复触发缓存失效。务必创建 `.dockerignore` 文件,明确排除:
- `target/`
- `**/*.class`
- `.git/`、`.gitignore`
- `*.md`、`*.log`、`*.iml`
- `Dockerfile`(本身不需要复制)
合并 RUN 命令并清理中间产物
每条 `RUN` 指令都生成一层。如果分开写 `apt-get update`、`apt-get install`、`rm -rf /var/lib/apt/lists/*`,后两条无法清除前一条产生的数据(Docker 层不可变),反而增大镜像体积,还可能让后续缓存因路径残留而行为异常。正确写法是单条命令闭环处理:
- `RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*`
- `RUN mvn package -DskipTests && mv target/*.jar app.jar`(再配合 `COPY app.jar .`,比 `COPY target/` 更精准)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











