将生成的jar文件的名称从Maven pom.xml传递到Dockerfile

时间:2017-09-16 07:31:00

标签: java maven dockerfile spotify

我有一个java / hibernate / jpa / maven项目,我试图转换,以便它(从项目创建的.jar文件)是Docker Image的一部分。我也在使用Spotify插件。

下面,对于以下Docker命令

ADD <full_path_of_generated_file>.jar app.jar

full_path_of_generated_file 是从pom.xml文件生成的(在Maven端)。为了让Docker正确生成图像,需要此信息。

如何将生成的文件的名称传递给Dockerfile?

TIA

Maven pom.xml文件的插件区域

<plugins>
<plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>

        <configuration>
            <imageName>apx/${project.artifactId}</imageName>
            <dockerDirectory>${project.basedir}/docker</dockerDirectory>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <!-- <version>2.6</version> -->
        <executions>
            <execution>
                <id>analyze</id>
                <phase>package</phase>
                <configuration>
                    <failBuild>true</failBuild>
                    <ignoreDirect>false</ignoreDirect>
                </configuration>
            </execution>
        </executions>
        <configuration>

            <finalName>${project.artifactId}</finalName>
            <archive>
                <manifest>
                    <mainClass>ccinfw.MainApplication</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
</plugins>

[... snip ...]

<artifactId>ccinf</artifactId>

以下是正在使用的Dockerfile的副本

FROM java:8
VOLUME /tmp
ADD <full_path_of_generated_file>.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2 个答案:

答案 0 :(得分:1)

内部pom.xml

COR_PRF_USE_PROFILE_IMAGES

确保将Dockerfile放置在pom中提到的位置,以便它可以动态替换引用来构建和复制Dockerfile。

enter image description here

内部Dockerfile

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${basedir}/target/</outputDirectory>
                        <resources>
                            <resource>
                                <directory>src/main/docker</directory>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

积分:https://github.com/vmudigal/microservices-sample

答案 1 :(得分:0)

对我来说有用的是将最终工件的名称(例如something_or_other-1.2.3-SNAPSHOT.jar)作为参数(ARG)传递到Dockerfile中。

在pom.xml中:

    <plugin>
        ...
        <configuration>
        ...
            <buildArgs>
                <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
            </buildArgs>
        </configuration>
    </plugin>

然后,在Dockerfile里面

    # insert other Dockerfile stuff here and then...

    ARG JAR_FILE
    ADD target/${JAR_FILE} app.jar
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]