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

时间:2019-06-04 07:00:31

标签: maven docker

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

  • 核心
  • 应用程序1
  • 应用2

Application 1Application 2是两个使用core的项目(例如,这些应用程序是为两个不同的客户构建的)

为了对所有这些进行Docker化,最简单的方法是创建一个多模块项目,但是缺点是我全部都在一个项目中(核心+应用程序1 +应用程序2)。

我希望将核心与它们分开。

此配置的主要问题是core项目需要在其他两个项目之前构建,而App 1App 2将此项目作为maven依赖项:

App 1

 <dependency>
    <groupId>it.myorg</groupId>
    <artifactId>core-project</artifactId>
    <version>1.12.0-SNAPSHOT</version>
 </dependency>

如果我尝试将App 1打包时将其打包,因为在Docker容器中的core-project 1.12.0-SNAPSHOT内部不存在。

我当时正在考虑设置一个“本地Maven存储库”,将内核推到那里,App 1将从存储库而不是.m2文件夹中“拉”罐子,但是我不喜欢这种解决方案

我可以提供更多信息,如果我不提供示例,抱歉,但是我的论文现在是白色的:(

文件夹结构

+- Core
--- pom.xml
--- src

+- Application1
--- pom.xml
--- src

我现在要解决的方法是为核心项目创建一个Dockerfile(FROM maven:latest),使用标签构建映像,并在App1的Dockerfile中使用该映像(因此,创建一个多阶段构建,但在两个不同的时刻)。

最好的是

FROM maven:latest as core-builder
## build the core

FROM maven:latest
## Copy jar from builder

因为项目位于单独的文件夹中,所以我无法以这种方式构建核心。我需要先构建del core(运行docker build -t),然后再从中复制。

更新

在@mihai给出正确答案后,我要问它是否可能是这样的结构:

-- myapp-docker
  - Dockerfile
  - docker-compose.yml
-- core-app
-- application_1

将Dockerfile置于core-appapplication_1的同一级别上,它完全可以正常工作并且100%工作。唯一的“问题”是我应该将所有项目放在同一个仓库中。

2 个答案:

答案 0 :(得分:1)

这是建议的多阶段构建解决方案。

要复制您的设置,我创建了以下结构:

.
├── 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>

我将Dockerfile命名为Dockerfile-app1,这样您就可以拥有多个Dockerfile。

这是Dockerfile-app1:

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

您可能应该在末尾添加一个入口点来运行您的项目,甚至最好再添加一个第三阶段,该阶段仅复制生成的人工制品并运行您的项目(这样最终的图像将不会包含您的原始资料)。

第一阶段仅构建core子模块。

第二阶段使用第一阶段的结果,仅复制application1的源并进行构建。

通过创建类似的文件application2,您可以轻松地为Dockerfile-app2复制此文件。

答案 1 :(得分:0)

由于您正在使用Maven,请尝试dockerfile-maven来生成图像。您不希望在映像中包含任何构建信息(例如依赖项是什么),只需在末尾添加jar。我通常将其与spring-boot-maven-pluginrepackage结合使用,以获得完全独立的jar。