【发布时间】:2021-04-03 09:54:55
【问题描述】:
我有一个类似于这个项目结构的多模块 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 来提供它,我需要从这个项目中创建一个 single jar。
现在我想知道:
- 有没有更好的方法在单个 Docker 容器中提供此类应用程序(不使用 docker-compose)?
- 如何使用 maven 从这个结构中创建一个 jar?
【问题讨论】:
-
容器的理念是每个容器有一个应用程序。常见的模式是使用 Docker Compose (docs.docker.com/compose) 之类的东西在一台主机上运行多个 Docker 镜像并设置它们之间的通信路由。
-
感谢您的快速回复!通常我使用 docker compose 来提供模块,但在这种情况下,我尝试只创建一个容器。有没有好的解决方案?
-
首先你有一个spring boot应用程序,这意味着你有一个包含整个应用程序的jar文件。另一个问题是:为什么要在 docker 内部构建而不是在外部构建,因为您没有在容器内映射缓存卷,这会导致重复下载依赖项。除此之外,为什么要在不运行测试的情况下进行构建?我建议在 docker 容器之外构建您的应用程序,只需将生成的 jar 文件复制到容器中即可。 github.com/GoogleContainerTools/jib/tree/master/examples/… 也可能有帮助
标签: java spring-boot docker maven dockerfile