多模块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
问题原因
- Jar包路径错误:多模块Gradle项目中,执行
gradle application:jar时,生成的Jar包并非存放在项目根目录的build/libs下,而是在application模块自身的build/libs目录(即容器内的/home/gradle/src/application/build/libs/),当前Dockerfile的COPY指令指向了根目录的build/libs,因此找不到文件。 - 冗余文件未排除(可选优化点):构建上下文包含了所有项目文件,部分无关文件(如本地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
相关产品推荐
相关产品推荐

