首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用通用模块组织多模块微服务的多级文档

如何用通用模块组织多模块微服务的多级文档
EN

Stack Overflow用户
提问于 2022-11-22 17:59:22
回答 1查看 23关注 0票数 0

我有一个具有以下结构的gRPC微服务项目:

代码语言:javascript
复制
- common (common protobuf definitions)
- microservices
  - ms1
    ..
  - msN

现在,我想为每个微服务添加多级Dockerfile。问题是,我有一个公共模块,我需要这个模块来构建其余的项目。我不能引用Dockerfile中的微服务项目之外的资源。

因此,我看到的唯一的优点是在根文件夹中有一个Dockerfile来构建所有的图像:

代码语言:javascript
复制
FROM maven:3.8.6-eclipse-temurin-17 AS builder
COPY ./ /usr/app
RUN mvn -f /usr/app/pom.xml clean package


FROM eclipse-temurin:17-jre-alpine
COPY --from=builder /usr/app/microservices/ms1/target/ms1-1.0-SNAPSHOT.jar /usr/app/ms1-1.0-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "/usr/app/ms1-1.0-SNAPSHOT.jar"]

但我还是要用建筑形象来建造所有的项目。我看到的另一个选项是为构建器创建单独的Docker映像,然后通过标记将其引用到microservice Dockerfile中。但是,在构建微服务映像时,如何触发构建者映像的重建呢?

还有其他选择吗?我应该用哪一种?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-22 18:42:30

我们可以使用多级dockerfile with arguments (docs.docker.com)maven's --also-make command line option (maven.apache.org)

代码语言:javascript
复制
FROM maven:3.8.6-eclipse-temurin-17 AS builder
ARG RELATIVE_PATH_TO_ADAPTER_MODULE # e.g. service/ms1
COPY ./ /usr/app

# specify the specific project to build via "-pl", we could also use "-f /usr/app/${PATH_TO_ADAPTER_MODULE}/pom.xml"
# we specify --also-make to also build the dependencies
RUN mvn -pl /usr/app/${PATH_TO_ADAPTER_MODULE} --also-make clean package

FROM eclipse-temurin:17-jre-alpine
ARG RELATIVE_PATH_TO_ADAPTER_MODULE # e.g. service/ms1
COPY --from=builder /usr/app/${RELATIVE_PATH_TO_ADAPTER_MODULE}/target/*.jar /usr/app/service.jar
ENTRYPOINT ["java", "-jar", "/usr/app/service.jar"]

如果target-directory包含多个.jar-file,则可以通过.dockerignore-file (docs.docker.com)排除所有不必要的.jar-files,例如在模块的根目录中。

然后,我们可以通过调用docker build with --build-arg (docs.docker.com)来构建特定的微服务。

代码语言:javascript
复制
docker build --build-arg RELATIVE_PATH_TO_ADAPTER_MODULE=services/ms1 --tag services/ms1 .
docker build --build-arg RELATIVE_PATH_TO_ADAPTER_MODULE=services/ms2 --tag services/m22 .
...

但是,请注意,每个构建仍然需要重新构建依赖模块;它们不是跨构建共享的。而且,每个构建都必须重新下载所有maven依赖项。This article at baeldung.com展示了如何使用主机目录作为maven缓存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74537160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档