Dockerfile多阶段构建时Gradle build未执行问题求助
Docker构建未触发Gradle打包、无预期产物问题排查
核心问题点
你的Dockerfile属于多阶段构建写法,但存在3个逻辑错误导致构建步骤完全不生效:
- 阶段完全脱节:两个
FROM定义的构建阶段没有任何关联,第二个运行阶段既没有执行Gradle构建,也没有从第一个build阶段拷贝编译产物,甚至ENTRYPOINT指向的/app.jar文件根本不存在。 - 工作路径错误:第一个构建阶段把源码拷贝到了
/temp目录,但执行gradle build时没有切换工作目录,Gradle会在镜像默认工作目录(/home/gradle)下寻找构建配置文件,根本找不到你拷贝的源码,就算执行命令也是空跑。 - 提示误导:你看到的
deployed successfully只是Dockerfile文件被平台识别加载的提示,不代表构建逻辑正确、产物生成成功。
修正后的Dockerfile参考
# 第一阶段:Gradle编译打包阶段 FROM gradle:4.7.0-jdk8-alpine AS build WORKDIR /build # 先拷贝构建配置文件,利用Docker缓存减少重复依赖下载 COPY build.gradle settings.gradle ./ RUN gradle dependencies --no-daemon # 拷贝全量源码后执行构建,-x test为跳过单元测试,不需要可以删除 COPY . . RUN gradle build --no-daemon -x test # 第二阶段:服务运行阶段 FROM java:8-jdk WORKDIR /app # 从第一构建阶段拷贝编译好的jar包,通配符自动匹配build/libs下的产出jar COPY --from=build /build/build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
额外说明
- 多阶段构建的核心逻辑是:前序阶段只负责编译打包,后续运行阶段仅拷贝需要的运行产物,不保留源码、构建工具等冗余内容,大幅缩小最终镜像体积。
- 如果你的项目构建出的jar有固定名称,也可以把通配符
*.jar替换成实际的jar文件名,避免拷贝到多余文件。
内容的提问来源于stack exchange,提问作者ProgramCOder
相关产品推荐
相关产品推荐

