构建多个maven模块,然后在docker镜像中复制JAR

问题描述 投票:1回答:1

我有一个配置了maven的多模块项目。

/myProject
  /module1
    /target
    pom.xml
  /module2
    /target
    pom.xml
  pom.xml

pom parent正在构建子模块。

使用com.spotify.dockerfile-maven-plugin我想构建所有模块,构建一个docker镜像并复制该图像中的所有JAR。

pom的父母

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>myTest</artifactId>
    <name>test</name>
    <version>0.0.1</version>
    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
        <module>module2</module>
    </modules>

</project>

如果我将一个Dockerfile放在/ myProject的根目录下,插件会抱怨模块1没有Dockerfile

FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} /home/xyz/jars

maven插件:

    <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>dockerfile-maven-plugin</artifactId>
        <configuration>
            <repository>mytest</repository>
            <buildArgs>
                <JAR_FILE>target/${project.artifactId}-${project.version}.jar</JAR_FILE>
            </buildArgs>
        </configuration>
    </plugin>

如果我将Dockerfile放在该模块中但是如何处理多个模块并且只有1个Dockerfile,这对一个模块工作正常?

我可以在父pom上使用单个mvn clean install构建子模块然后构建docker镜像吗?

也许只用pom和Dockerfile创建一个子模块?

maven docker
1个回答
1
投票

如果jar是一个可执行文件的依赖项,那么是的,您可以构建一个可执行文件,并在其pom.xml文件中声明其依赖项。 Maven应该figure out which order to build the submodules in,只要你不创造一个循环。正如您所建议的那样,您希望将其作为子模块而不是根pom,因为根pom是由其他模块继承的父配置。只需将插件放在那个子模块上(在其pom.xml中),只给它一个Dockerfile。

(如果你认为这是一个问题,根据同一个maven项目中的库有一个可执行文件,那么它与docker没有关系。你可以ask the same question about a spring boot app using libraries in the same multi-module project。从某种意义上说,这就是问题,因为jar将与它一起构建依赖并复制到docker镜像。)

或者,如果你的意思是每个子模块的每个jar本身都是一个可执行文件(而且我认为你不这样做),那么你可以创建多个docker镜像,每个都来自它自己的Dockerfile,然后你就可以捆绑并一起启动它们了。想要使用docker-compose文件。

© www.soinside.com 2019 - 2024. All rights reserved.