如何在Docker容器内使用依赖镜像通过Maven构建Spring Boot项目?
问题描述
我有两个Spring Boot项目:core项目作为依赖被sascar项目引用。我编写了构建core镜像的Dockerfile:
FROM maven:3.3-jdk-8 WORKDIR /opt/ivr-engine-core ADD ./engine-core/. /opt/engine-core RUN ls -la /opt/engine-core RUN mvn clean install
执行构建命令:
docker build . -t engine-core
随后启动容器并挂载sascar项目进入bash:
docker run -it --rm -w /app -v "$PWD/engine-sascar:/app" engine-core:latest bash
在容器内执行mvn clean package时,sascar项目无法找到core的类,报错:
[INFO] Compiling 35 source files to /app/target/classes [INFO] ------------------------------------------------------------- [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] /app/src/main/java/com/app/sascar/StepOne.java:[8,33] package com.engine.core does not exist
问题原因
- Dockerfile路径配置错误:Dockerfile中设置的
WORKDIR为/opt/ivr-engine-core,但通过ADD命令将core项目文件放到了/opt/engine-core目录。执行mvn clean install时,当前目录是/opt/ivr-engine-core,该目录下没有core项目的pom.xml,导致mvn install并未将core项目安装到镜像内的Maven本地仓库(/root/.m2)。 - 依赖坐标不匹配:如果
sascar项目的pom.xml中对core的依赖配置(groupId、artifactId、version)与core项目pom.xml中的定义不一致,Maven也无法找到对应的依赖。
解决方法
1. 修正Dockerfile,确保core正确安装到Maven仓库
修改Dockerfile的路径配置,让mvn install在core项目根目录执行:
FROM maven:3.3-jdk-8 # 将工作目录设置为core项目目录 WORKDIR /opt/engine-core # 将本地core项目文件复制到容器的工作目录 ADD ./engine-core/. . # 验证文件是否存在(可选) RUN ls -la # 执行安装,将core安装到容器内的Maven本地仓库 RUN mvn clean install
重新构建镜像:
docker build . -t engine-core
2. 检查sascar项目的依赖配置
打开sascar项目的pom.xml,确保依赖的坐标与core项目pom.xml完全一致。例如,如果core的pom.xml定义如下:
<groupId>com.engine</groupId> <artifactId>core</artifactId> <version>1.0.0-SNAPSHOT</version>
那么sascar的pom.xml中需要添加:
<dependency> <groupId>com.engine</groupId> <artifactId>core</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency>
3. 重新构建sascar项目
启动容器并进入后,执行:
mvn clean package
此时Maven会从容器内的/root/.m2仓库中找到core依赖,完成编译。
内容的提问来源于stack exchange,提问作者Francisco Souza
相关产品推荐
相关产品推荐

