You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模块Java项目Docker构建报错:no such file or directory问题排查

多模块Java项目Docker构建报错问题排查与修复

问题场景

我需要为包含application、model、worker三个模块的多模块Java项目构建Docker镜像,每个模块单独生成镜像。项目结构如下:

/Projects/api
├── application
├── model
├── worker
build.gradle
settings.gradle
otherfiles

在application模块下新增deployment目录存放Dockerfile,路径结构:

/Projects/api
├── application
  ├── deployment
    ├── Dockerfile

Dockerfile内容:

FROM gradle:jdk11 as build
COPY --chown=gradle:gradle . /home/gradle/src 
WORKDIR /home/gradle/src
RUN gradle application:jar --no-daemon 

FROM amazoncorretto:11
RUN mkdir /app
COPY --from=build /home/gradle/src/build/libs/*.jar /app/app.jar
CMD ["java", "-jar", "/app/app.jar" ]

从/Projects/api路径执行构建命令:

docker build -f application/deployment/Dockerfile -t app:1.0 .

本地执行gradle application:jar能正常生成build/libs/application*.jar,但Docker构建时报错:

> [stage-1 3/3] COPY --from=build /home/gradle/src/build/libs/*.jar /app/app.jar:
------
lstat /var/lib/docker/tmp/buildkit-mount2641523939/home/gradle/src/build/libs: no such file or directory

问题原因

  1. Jar包路径错误:多模块Gradle项目中,执行gradle application:jar时,生成的Jar包并非存放在项目根目录的build/libs下,而是在application模块自身的build/libs目录(即容器内的/home/gradle/src/application/build/libs/),当前Dockerfile的COPY指令指向了根目录的build/libs,因此找不到文件。
  2. 冗余文件未排除(可选优化点):构建上下文包含了所有项目文件,部分无关文件(如本地build目录、.git文件等)会增加构建上下文大小,拖慢构建速度。

修复方案

方案1:修正COPY指令的Jar包路径

直接修改Dockerfile中的COPY路径,指向application模块的build目录:

FROM gradle:jdk11 as build
COPY --chown=gradle:gradle . /home/gradle/src 
WORKDIR /home/gradle/src
RUN gradle application:jar --no-daemon 

FROM amazoncorretto:11
RUN mkdir /app
# 修正路径为application模块下的build/libs
COPY --from=build /home/gradle/src/application/build/libs/*.jar /app/app.jar
CMD ["java", "-jar", "/app/app.jar" ]

方案2:统一Jar包输出目录(可选)

若希望Jar包输出到项目根目录的build/libs,可在application模块的build.gradle中添加配置,将Jar包复制到根目录:

task copyJarToRoot(type: Copy) {
    from jar
    into rootProject.file('build/libs')
}
build.dependsOn copyJarToRoot

配置完成后,执行gradle application:jar会自动将Jar包同步到根目录build/libs,原Dockerfile无需修改。

补充:添加.dockerignore优化构建

在/Projects/api目录下创建.dockerignore文件,排除无关文件:

.git
.gitignore
build
*.log
*.idea
*.iml

内容的提问来源于stack exchange,提问作者jarxinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:48:03