本文详解如何通过多阶段构建在 docker 中安全、高效地编译 maven 项目,并解决因路径不一致导致的 `lstat target: no such file or directory` 构建错误。
在 Docker 中构建 Java 应用时,使用 Maven 多阶段构建(multi-stage build)是最佳实践:第一阶段负责编译和打包,第二阶段仅包含运行时依赖(如 JRE),从而显著减小镜像体积、提升安全性与可移植性。但实践中,一个常见陷阱是未正确指定构建产物的来源路径,导致 COPY target/*.jar 失败——正如错误信息所示:lstat /var/lib/docker/tmp/buildkit-mount.../target: no such file or directory。
根本原因在于:Docker 的 COPY 指令在非构建阶段(即第二阶段)中无法直接访问前 
✅ 正确做法是使用 COPY --from=
FROM maven:3.8.1-openjdk-17 AS builder COPY src/ /tmp/src/ COPY pom.xml /tmp/ WORKDIR /tmp RUN mvn clean install -B # -B 启用批处理模式,避免交互提示 FROM openjdk:17-jre-slim # ⚠️ 关键优化:改用精简 JRE 镜像,而非完整 Maven 镜像 WORKDIR /app COPY --from=builder /tmp/target/*.jar app.jar EXPOSE 8081 ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"]
? 关键改进说明:
⚠️ 注意事项:
WORKDIR /workspace COPY . . RUN mvn clean package -DskipTests COPY --from=builder /workspace/target/*.jar /app/app.jar
总结:Docker 多阶段构建不是“连续 shell 会话”,每个阶段拥有独立文件系统。务必用 --from 明确阶段间依赖,并用绝对路径定位产物。遵循此原则,即可稳定实现 Maven 项目的容器化构建与轻量部署。