java—如何在单个docker容器中为多模块spring boot应用程序提供服务?

93ze6v8z  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(304)

我有一个多模块spring boot应用程序,它看起来类似于此项目结构:

hello-world
│   
├── hello-world-core
│   └── HelloWorldApplication.java
│   └── pom.xml <--- hello-world-core POM
│   └── src     <--- hello-world-core src
│   └── target  <--- hello-world-core target with jar
├── hello-world-users
│   └── pom.xml <--- hello-world-users POM
│   └── src     <--- hello-world-users src
│   └── target  <--- hello-world-users target with jar
├── hello-world-website
│   └── pom.xml <--- hello-world-website POM
│   └── src     <--- hello-world-website src
│   └── target  <--- hello-world-website target with jar
└── pom.xml

现在我想在一个docker容器中为应用程序提供如下图像:


# jdk 11 image

FROM maven:3.6-jdk-11 as builder

# Copy local code to the container image.

WORKDIR /app

# copy the project files

COPY pom.xml .

# copy your other files

COPY src ./src

# Build a release artifact.

RUN mvn package -DskipTests

# Use AdoptOpenJDK for base image.

FROM adoptopenjdk/openjdk11:alpine-slim

# Copy the jar to the production image from the builder stage.

COPY --from=builder /app/target/hello-world*.jar /hello-world.jar

EXPOSE 8080

# Run the web service on container startup.

CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/hello-world.jar"]

为了使用这个dockerfile提供服务,我需要从这个项目中创建一个jar。
现在我在想:
有没有更好的方法在单个docker容器中为此类应用程序提供服务(不使用docker compose)?
如何用maven从这个结构中创建一个jar?

50pmv0ei

50pmv0ei1#

如果你想在一个容器里做这件事,有一些方法可以做到,
您可以像以前一样分别构建3个不同的spring模块,并在同一个映像中的不同端口中运行这3个jar。因此,您必须使用maven更改jar中绑定的端口,因为我们试图在一个容器中运行所有3个进程,因此如果您尝试这样做,使用8080(默认值)将导致错误。
server.port=9090
类似于上面的东西,在application.properties中使用会有所帮助。因此在此之后,您必须在容器内手动运行它们,或者将它们全部附加到容器启动脚本。
前任:

RUN java -jar hello-world-core.jar & java -jar hello-world-users.jar

因此,当您这样做时,不同的jar将服务于您在pom文件中分别提到的不同端口。因此,为了从外部访问它们,还必须暴露这些端口。
如果你真的想把它们放在一个容器里,为什么要把它们分开呢?还有三只单独的假猫要处死?我的意思是所有3个应用程序都有单独的tomcats在里面,这就是为什么我们很难将它合并到1。那么,我们为什么不避开那些tomcat,构建war文件,然后在容器中安装一个tomcat,并将所有war放到webapps文件夹中呢?这意味着您必须将一个tomcat放到docker并使用它,这样所有的应用程序都将使用同一个tomcat,并且可以通过8080访问。
我相信从微观服务的Angular 来看,把这些分开是很好的,是的,这样做有利弊。我也同意@khmarbaise在他的评论中所说的,跳过测试不是一个好主意d

相关问题