Dockerfile中mvn package无法更新Spring Boot Jar包的解决方法
Spring Boot容器化Dockerfile构建Jar不更新问题解决
核心问题分析
你的Dockerfile存在两个关键错误,导致容器内构建的Jar包无法被正确使用:
- 无效的基础镜像声明:开头的
FROM openjdk:11会被后续的FROM maven:3.8-jdk-11 as maven_build完全覆盖,属于冗余配置。 - Jar包复制来源错误:
COPY ${JAR_FILE} app.jar默认从本地主机文件系统复制文件,而非你在maven_build阶段生成的新Jar包。这就是为什么手动执行mvn package后构建镜像能正常工作——此时本地target目录有新Jar,Docker直接复用了本地文件;未提前构建时,要么找不到文件,要么使用旧的缓存文件。
修正后的Dockerfile
# 构建阶段:使用Maven编译打包项目 FROM maven:3.8-jdk-11 as maven_build WORKDIR /app COPY pom.xml . COPY src ./src # 可选添加-DskipTests跳过测试,加快构建速度 RUN mvn clean package -DskipTests # 运行阶段:使用轻量OpenJDK镜像运行应用 FROM openjdk:11 WORKDIR /app # 从构建阶段复制最新生成的Jar包到当前镜像 COPY --from=maven_build /app/target/*.jar app.jar ENTRYPOINT ["java","-jar","/app/app.jar"]
修正说明
- 采用多阶段构建:将编译打包和运行分离,构建阶段负责生成Jar,运行阶段只保留运行所需的JDK和Jar,大幅减小镜像体积。
- 指定复制来源:通过
COPY --from=maven_build明确从构建阶段复制Jar包,确保使用的是容器内刚构建的最新产物。 - 添加
WORKDIR:统一工作目录,让文件结构更清晰,避免路径混乱。
验证步骤
删除本地target目录,直接执行以下命令即可完成构建和运行:
docker build -t demo-app . docker run -p 8080:8080 demo-app
内容的提问来源于stack exchange,提问作者victor
相关产品推荐
相关产品推荐

