如何在 Docker 化微服务应用时处理常见的 Spring Boot 模块?

问题描述 投票:0回答:1

我想将所有 Spring Boot 微服务 Dockerize 到一个 docker-compose 文件中。问题是所有微服务都使用一个公共模块,我在其中编写了共享代码(以避免重复),但我不知道如何在 Docker 进程中处理它。

这是项目的结构:

root/
├── docker-compose.yml
├── common/
│   ├── pom.xml
│   └── src/
├── discovery/
│   ├── Dockerfile
│   ├── pom.xml
│   └── src/
├── gateway/
│   ├── Dockerfile
│   ├── pom.xml
│   └── src/
└── auth-service/
    ├── Dockerfile
    ├── pom.xml
    └── src/

docker-compose.yml(根):

version: '3.8'

services:
  postgres:
    image: postgres:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    ports:
      - "5433:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - gym-tracker

  api-discovery:
    build:
      context: ./discovery
      dockerfile: Dockerfile
    networks:
      - gym-tracker

  api-gateway:
    build:
      context: ./gateway
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - api-discovery
    networks:
      - gym-tracker

  auth-service:
    build:
      context: .
      dockerfile: auth-service/Dockerfile
    depends_on:
      - postgres
      - api-discovery
      - api-gateway
    networks:
      - gym-tracker

networks:
  gym-tracker:
    external: true

volumes:
  postgres_data:
    driver: local

我尝试了使用以下 Dockerfile(auth-service)的多阶段方法:

FROM maven:3.9.7-eclipse-temurin-21-alpine AS build
WORKDIR /app

COPY common/pom.xml /tmp/common/pom.xml
COPY common/src /tmp/common/src
RUN mvn -f /tmp/common/pom.xml clean install -DskipTests

COPY auth-service/pom.xml ./pom.xml
COPY auth-service/src ./src

RUN mvn clean package -DskipTests

FROM openjdk:21-jdk
WORKDIR /app

COPY --from=build /app/target/*.jar app.jar

EXPOSE 8082

ENTRYPOINT ["java", "-jar", "app.jar"]

我在容器中打包 auth-service 时仍然遇到这些错误:

15.57 [ERROR] COMPILATION ERROR : 
15.57 [INFO] -------------------------------------------------------------
15.57 [ERROR] /app/src/main/java/com/gym/tracker/authservice/controller/AuthController.java:[6,37] package com.gym.tracker.common.entity does not exist
15.57 [ERROR] /app/src/main/java/com/gym/tracker/authservice/controller/AuthController.java:[7,38] package com.gym.tracker.common.service does not exist
... and much more errors ...

我该如何正确解决这个问题?

spring-boot docker maven docker-compose microservices
1个回答
0
投票

您可以尝试使用

maven-assembly-plugin
在父 pom 构建期间包含您的常用 jar。如果这可以解决您的问题,请参阅下面的链接。

https://gauthier-cassany.com/posts/build-jar-inside-docker

© www.soinside.com 2019 - 2024. All rights reserved.