构建多个Maven模块,然后在Docker映像内复制JAR

时间:2018-08-28 14:57:07

标签: maven docker

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

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

pom父级正在构建子模块。

使用 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的根目录下,则插件会抱怨module1没有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放在一个模块中,则对一个模块工作正常,但是如何处理多个模块而只有一个Dockerfile?

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

也许通过仅使用pom和Dockerfile创建子模块?

1 个答案:

答案 0 :(得分:1)

如果jar是一个可执行文件的依赖项,那么可以,您可以使用在pom.xml文件中声明的依赖项来构建该可执行文件。只要您不创建循环,Maven就应该figure out which order to build the submodules in。如您建议的那样,您想使其成为子模块而不是root pom,因为root 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文件,请一起使用。