Dockerfile构建多模块Maven项目无法解析父POM异常问题求助
问题根因
- Docker构建上下文默认限制:在子模块(springapp1/springapp2)目录下执行docker build时,上下文默认是当前子模块目录,无法访问上层的父pom.xml,所以
COPY ../pom.xml /build/实际没有成功复制到父pom,导致容器内/build目录下根本没有父pom文件 - 你使用的
maven:3.5.2-jdk-8-alpine镜像的JDK版本是8,但是你的父pom和子pom都指定了java.version为11,版本不兼容也会导致构建失败 - 父pom没有提前安装到Maven本地仓库,子模块构建时无法找到父依赖
- 原Dockerfile中复制jar的路径错误,子模块构建出的jar包会生成在子模块的target目录,而非根目录的target目录
解决方案
方案1:从项目根目录执行构建(推荐)
- 执行构建命令时切换到项目根目录
the_project下执行,指定Dockerfile路径即可:
# 构建springapp1镜像 docker build -f springapp1/Dockerfile .
- 修改子模块的Dockerfile内容,修复路径、版本、构建逻辑问题:
# 换成JDK11版本的Maven镜像,和项目JDK版本对齐 FROM maven:3.8.6-jdk-11 AS MAVEN_BUILD # 复制根目录父pom COPY pom.xml /build/ # 复制当前子模块的pom和源码 COPY springapp1/pom.xml /build/child/ COPY springapp1/src /build/child/src/ # 先安装父pom到本地仓库 WORKDIR /build/ RUN mvn -N install # 再构建子模块 WORKDIR /build/child/ RUN mvn package FROM adoptopenjdk:11-jre-hotspot WORKDIR /app # 修正jar包路径为子模块target目录 COPY --from=MAVEN_BUILD /build/child/target/app1-0.0.1-SNAPSHOT-jar-with-dependencies.jar /app/ ENTRYPOINT ["java","-Dspring.profiles.active=prod","-jar","app1-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]
如果使用docker-compose,修改对应服务的build配置即可:
services: springapp1: build: context: ./the_project # 替换为the_project目录的相对/绝对路径 dockerfile: springapp1/Dockerfile # 其余配置省略
方案2:子模块目录下直接构建(适合快速测试场景)
如果一定要在子模块目录下执行构建,可以先在本地执行父pom安装,再修改Dockerfile跳过父pom相对路径检查:
- 先在项目根目录执行命令安装父pom到本地仓库:
mvn -N install
- 修改子模块Dockerfile:
FROM maven:3.8.6-jdk-11 AS MAVEN_BUILD COPY ./pom.xml /build/child/ COPY src /build/child/src/ WORKDIR /build/child/ # 构建时忽略父pom相对路径,直接从本地仓库拉取父依赖 RUN mvn package -Dparent.relativePath="" FROM adoptopenjdk:11-jre-hotspot WORKDIR /app COPY --from=MAVEN_BUILD /build/child/target/app1-0.0.1-SNAPSHOT-jar-with-dependencies.jar /app/ ENTRYPOINT ["java","-Dspring.profiles.active=prod","-jar","app1-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]
内容的提问来源于stack exchange,提问作者AlexKL
相关产品推荐
相关产品推荐

