如何将带本地依赖的Spring Boot Maven应用容器化及配置Docker Compose
无Maven环境下Docker构建多模块Spring Boot项目方案
我有两个Spring Boot模块util(作为本地依赖)和user-service,本地通过mvn clean package deploy把util部署到本地Maven仓库后,user-service可正常运行。现在要让克隆项目的人不用安装Maven,直接通过Docker一键构建启动,具体方案如下:
一、Dockerfile编写(共2个)
1. util模块Dockerfile(生成可复用的Maven依赖仓库)
在util目录下创建Dockerfile,用容器内的Maven环境完成依赖构建:
# 基于官方Maven镜像构建 FROM maven:3.8.6-openjdk-11 AS builder WORKDIR /app # 复制util的pom和源码 COPY pom.xml . COPY src ./src # 执行deploy,将util发布到容器内的本地仓库(对应pom里配置的local-maven-repo) RUN mvn clean package deploy # 导出构建好的仓库目录,供user-service使用 FROM scratch AS export-repo COPY --from=builder /app/target/local-maven-repo /local-maven-repo
2. user-service模块Dockerfile(构建可运行的应用镜像)
在user-service目录下创建Dockerfile,利用util生成的依赖仓库打包应用:
# 第一阶段:构建应用 FROM maven:3.8.6-openjdk-11 AS builder WORKDIR /app COPY pom.xml . # 创建Maven仓库路径,复制util构建好的依赖包 RUN mkdir -p /root/.m2/repository/com/gucardev/util/0.0.1-SNAPSHOT COPY --from=util-build /local-maven-repo/com/gucardev/util/0.0.1-SNAPSHOT/* /root/.m2/repository/com/gucardev/util/0.0.1-SNAPSHOT/ # 复制源码并打包(-DskipTests可选,按需调整) COPY src ./src RUN mvn clean package -DskipTests # 第二阶段:生成轻量运行镜像 FROM openjdk:11-jre-slim WORKDIR /app # 替换为你实际的user-service jar包名称 COPY --from=builder /app/target/user-service-0.0.1-SNAPSHOT.jar app.jar # 暴露应用端口,按需调整 EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
二、docker-compose.yml编写(一键构建启动)
在项目根目录创建docker-compose.yml,定义服务依赖和启动规则:
version: '3.8' services: # 仅负责构建util的依赖仓库,构建完成即停止 util-build: build: context: ./util dockerfile: Dockerfile command: /bin/true volumes: - util-repo:/local-maven-repo # user-service应用服务 user-service: build: context: ./user-service dockerfile: Dockerfile depends_on: # 确保util依赖构建完成后再启动user-service的构建 util-build: condition: service_completed_successfully ports: # 宿主端口:容器端口,按需调整 - "8080:8080" restart: unless-stopped # 共享卷,传递util的Maven仓库 volumes: util-repo:
三、使用方式
克隆项目后,直接在根目录执行以下命令,全程无需宿主机器安装Maven:
docker compose up -d --build
补充说明
- 若
util仅作为依赖无需运行,util-build服务仅执行构建任务,不会长期运行 - 可根据项目实际使用的JDK版本,调整Dockerfile中的镜像标签(如替换为
openjdk-17) - 若
user-service需要外部服务(如数据库),可直接在docker-compose.yml中添加对应服务配置
内容的提问来源于stack exchange,提问作者gurkan
相关产品推荐
相关产品推荐

