gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:25:41 26 4
gpt4 key购买 nike

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

  • 核心
  • 申请1
  • 申请二
  • 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>

    如果我尝试 dockerize App 1当我打包它时它失败了,因为在 docker 容器 core-project 1.12.0-SNAPSHOT 内部不存在。

    我正在考虑设置一个“本地 maven 存储库”,将核心推到那里和 App 1将从 repo 中“拉” jar ,而不是从 .m2文件夹,但我不喜欢这个解决方案。

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

    文件夹结构
    +- Core
    --- pom.xml
    --- src

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

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

    最好的将是
    FROM maven:latest as core-builder
    ## build the core

    FROM maven:latest
    ## Copy jar from builder

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

    更新

    在@mihai 给出正确答案后,我问它是否可能是这样的结构:
    -- myapp-docker
    - Dockerfile
    - docker-compose.yml
    -- core-app
    -- application_1

    使 Dockerfile 与 core-app 处于同一级别和 application_1它完全没问题,而且 100% 正常工作。唯一的“问题”是我应该将所有项目放在同一个仓库中。

    最佳答案

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

    为了复制您的设置,我创建了这个结构:

    .
    ├── 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 , 这样你就可以拥有超过 1 个。

    这是 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 .

    关于maven - Dockerize 一个多 Maven 项目(不是多模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56438864/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com