Dockerize一个多maven项目(不是多模块)

Dockerize一个多maven项目(不是多模块),maven,docker,Maven,Docker,在我的maven应用程序中,我有多个项目: 核心 应用程序1 应用程序2 应用程序1和应用程序2是使用核心的两个项目(例如,这些应用程序是为两个不同的客户构建的) 为了将它们全部Dockerize,最简单的方法是创建一个多模块项目,但缺点是我将它们都放在一个项目中(核心+应用程序1+应用程序2) 我想把核心和它们分开 此配置的主要问题是,核心项目需要在其他两个项目之前构建,并且App 1和App 2使用此作为maven依赖项: App 1 <dependency> &l

在我的maven应用程序中,我有多个项目:

  • 核心
  • 应用程序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