多阶段构建是Java项目Docker镜像瘦身的核心,第一阶段用Maven编译打包,第二阶段仅复制JAR至精简JRE镜像,避免包含源码、pom.xml、JDK等冗余内容,可将镜像压至100MB以内。

Java 项目用 Docker 构建镜像,核心不是“完美编译”,而是让 docker build 正确调用构建工具(如 Maven 或 Gradle),把编译产物(通常是 JAR)打进镜像,最终得到一个只含运行时依赖、不带源码和构建工具的轻量镜像。
明确目标:镜像里只留可执行 JAR 和 JRE
Java 应用的 Docker 镜像不该包含 src/、pom.xml、Maven 二进制或 JDK 全量环境。推荐采用多阶段构建(multi-stage build):第一阶段用 maven:3.9-openjdk-17 编译打包;第二阶段用 eclipse-jetty:jre17-slim 或 openjdk:17-jre-slim 运行 JAR。这样镜像体积通常能压到 100MB 以内。
Dockerfile 要写对阶段和 COPY 规则
关键点在于分清构建阶段与运行阶段,且只把 target 目录下的 final JAR 拷过去:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 第一阶段命名(如
builder)后,执行mvn clean package -DskipTests - 第二阶段用 slim JRE 基础镜像,
COPY --from=builder /app/target/*.jar app.jar - 避免写
COPY . .,否则会把整个工程目录(含target/外的冗余文件)复制进去 - 显式指定入口:
ENTRYPOINT ["java","-jar","/app.jar"]
docker build -t 的路径和上下文必须精准
-t 只是打标签,真正影响构建结果的是构建上下文(context)路径。常见错误是:在项目根目录外执行命令,或 . 包含了 target/ 目录但没在 .dockerignore 中排除:
立即学习“Java免费学习笔记(深入)”;
- 务必在
pom.xml所在目录下运行:docker build -t my-java-app:1.0 . - 创建
.dockerignore文件,加入:target/、src/、pom.xml(如果不用它构建)、.git/、README.md - 若 JAR 名不确定,可在
pom.xml中固定:<finalName>app</finalName>,方便 COPY 时写死路径
验证镜像是否真轻量且可运行
构建完别急着推送,先本地检查:
- 看大小:
docker images my-java-app:1.0—— 正常应 ≤ 120MB(JRE slim + 单个 JAR) - 查内容:
docker run --rm -it my-java-app:1.0 ls -l /app.jar确认只有 JAR 存在 - 试启动:
docker run --rm -p 8080:8080 my-java-app:1.0,再curl localhost:8080/health - 如果报
ClassNotFoundException,大概率是 JAR 没正确 COPY 或 MANIFEST.MF 缺主类声明

















