Dockerize一个多maven项目(不是多模块)
在我的maven应用程序中,我有多个项目:Dockerize一个多maven项目(不是多模块),maven,docker,Maven,Docker,在我的maven应用程序中,我有多个项目: 核心 应用程序1 应用程序2 应用程序1和应用程序2是使用核心的两个项目(例如,这些应用程序是为两个不同的客户构建的) 为了将它们全部Dockerize,最简单的方法是创建一个多模块项目,但缺点是我将它们都放在一个项目中(核心+应用程序1+应用程序2) 我想把核心和它们分开 此配置的主要问题是,核心项目需要在其他两个项目之前构建,并且App 1和App 2使用此作为maven依赖项: App 1 <dependency> &l
- 核心
- 应用程序1
- 应用程序2
应用程序1
和应用程序2
是使用核心的两个项目(例如,这些应用程序是为两个不同的客户构建的)
为了将它们全部Dockerize,最简单的方法是创建一个多模块项目,但缺点是我将它们都放在一个项目中(核心+应用程序1+应用程序2)
我想把核心和它们分开
此配置的主要问题是,核心
项目需要在其他两个项目之前构建,并且App 1
和App 2
使用此作为maven依赖项:
App 1
<dependency>
<groupId>it.myorg</groupId>
<artifactId>core-project</artifactId>
<version>1.12.0-SNAPSHOT</version>
</dependency>
我现在尝试的解决方案是为核心项目创建Dockerfile(来自maven:latest),使用标记构建映像,并在App1的Dockerfile中使用此映像(因此,创建一个多阶段构建,但需要两个独立的时刻)
最好是
FROM maven:latest as core-builder
## build the core
FROM maven:latest
## Copy jar from builder
因为项目在单独的文件夹中,我不能用这种方式构建核心。我需要先构建delcore(运行dockerbuild-t),然后再从中复制
更新
在@mihai给出正确答案后,我问是否可能有这样的结构:
-- myapp-docker
- Dockerfile
- docker-compose.yml
-- core-app
-- application_1
Dockerfile与核心应用程序和应用程序处于同一级别完全可以正常工作。唯一的“问题”是我应该将所有项目放在同一个回购协议中。既然您使用的是maven,请尝试构建映像。您不希望在映像中包含任何构建信息(比如依赖项),您应该在末尾添加jar。我通常将它与spring boot maven插件
和重新打包
一起使用,以获得一个完全独立的jar。这是一个多阶段构建的建议解决方案
要复制您的设置,我创建了以下结构:
.
├── Dockerfile-app1
├── application1
│ ├── pom.xml
│ └── src
│ └── main
│ ├── resources
│ └── webapp
│ ├── WEB-INF
│ │ └── web.xml
│ └── index.jsp
├── core
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── test
│ │ └── App.java
│ └── test
│ └── java
│ └── com
│ └── test
│ └── AppTest.java
在应用程序1的pom.xml文件中,我将依赖项添加到core
:
<dependency>
<groupId>com.test</groupId>
<artifactId>core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
您可能应该在末尾添加一个入口点来运行您的项目,或者更好地添加另一个第三阶段,该阶段只复制生成的工件并运行您的项目(这样最终图像将不会包含您的源代码)
第一阶段只构建核心
子模块
第二阶段使用第一阶段的结果,仅复制application1的源代码并构建它
通过创建一个类似的文件Dockerfile-app2
,application2
可以很容易地复制这一点。为此,您应该使用多阶段构建:一个用于app1,一个用于app2。在这两种情况下,第一阶段都是构建核心。在第二阶段,复制.m2文件夹并进行构建。因此,您需要2个DockerFile:每个应用程序一个。每个dockerfile都是一个多级构建。你能用这个吗?或者你想要一个例子吗?我当时的想法是创建一个多阶段构建,但问题是我试图在docker-compose.yml上定义的上下文(项目位于单独的文件夹中,我很难创建此配置)。如果你能提供一个例子(Dockerfile和docker compose),对其他用户来说也是一个很好的例子:)你至少能共享文件夹结构吗?我用更多的信息更新了这个问题非常感谢,昨天在做了一些实验之后,我复制了这个结构,它很有效。Mhhh您认为Dockerfile-app1可以放在文件夹中吗?包含Dockerfile-app1和docker-compose.yml的文件夹。这是因为如果我不使用Dockerfile-app1,我需要创建一个包含所有项目的git回购。如果有一个文件夹myapp docker可以实现这一点,那就太好了。。是否可能?我相信每个应用程序都应该有自己的Dockerfile(紧挨着pom.xml)。核心项目也是如此。然后,您可以构建一次核心项目,并将该映像推送到注册表(如果需要),然后将该映像用作每个应用程序的基础。因此,应用程序的Dockerfile将以core:latest的开头。这对你来说不是更好吗?
<dependency>
<groupId>com.test</groupId>
<artifactId>core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
FROM maven:3.6.0-jdk-8 as build
WORKDIR /apps
COPY ./core .
RUN mvn clean install
FROM maven:3.6.0-jdk-8
# If you comment this out then the build fails because it cannot find the dependency to 'core'
COPY --from=build /root/.m2 /root/.m2
COPY ./application1 ./
RUN mvn clean install