2017-06-03 76 views
0

我想在docker build中参数化最终的jar文件名。我需要docker-maven-plugin来通过命令行参数传递jar文件名。 Maven构建不会在构建图像时抛出任何错误。通过从命令行传递jar文件名来构建参数化docker

如果我在dockerfile中硬编码jar文件名,它工作正常。

Maven的命令搬运工构建:

mvn -X -s settings.xml docker:build -DJAR_FILE_NAME=${filename} 

我的搬运工文件:

RUN curl -kfsSL https://example.com/UnlimitedJCEPolicyJDK8/US_export_policy.jar > US_export_policy.jar \ 
&& curl -kfsSL https://example.com//UnlimitedJCEPolicyJDK8/local_policy.jar > local_policy.jar \ 
    && mv local_policy.jar ${JAVA_HOME}/jre/lib/security \ 
    && mv US_export_policy.jar ${JAVA_HOME}/jre/lib/security \ 
    && rm -rf US_export_policy.jar local_policy.jar 

ENV JAVA_KEYSTORE ${JAVA_HOME}/jre/lib/security/cacerts 
RUN curl -kfsSL https://example.com/mycert.cer > mycert.cer \ 
    && ${JAVA_HOME}/bin/keytool -v -importcert -file mycert.cer -keystore ${JAVA_KEYSTORE} -storepass dummy -alias dummy -noprompt \ 
    && rm mycert.cer 

VOLUME /tmp 
#ADD myservice-2.0.2-SNAPSHOT.jar app.jar <-hard-coded name works fine 

RUN echo "final jar file name" 
RUN echo ${JAR_FILE_NAME} 

ADD ${JAR_FILE_NAME} app.jar 
RUN bash -c 'touch /app.jar' 
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 

我的pom.xml

<plugin> 
    <groupId>com.spotify</groupId> 
    <artifactId>docker-maven-plugin</artifactId> 
    <version>0.4.0</version> 
    <configuration> 
     <imageName>${docker.image.prefix}/myservice</imageName> 
     <dockerDirectory>src/main/docker</dockerDirectory> 
     <resources> 
      <resource> 
       <targetPath>${docker.resource.targetPath}</targetPath> 
       <directory>${project.build.directory}</directory> 
       <include>${project.build.finalName}.jar</include> 
      </resource> 
     </resources> 
    </configuration> 
</plugin> 

从搬运工构建过程输出:

Step 6 : VOLUME /tmp 
---> Using cache 
---> xxxxxxxxx 
Step 7 : RUN /bin/bash -c echo JAR_FILE_NAME1 in docker :$JAR_FILE_NAME 
---> Using cache 
---> xxxxxxxxx 
Step 8 : RUN /bin/bash -c echo JAR_FILE_NAME2 in docker :${JAR_FILE_NAME} 
---> Using cache 
---> xxxxxxxxx 
Step 9 : RUN echo $JAR_FILE_NAME 
---> Using cache 
---> xxxxxxxxx 
Step 10 : RUN echo "final jar file name" 
---> Using cache 
---> xxxxxxxxx 
Step 11 : RUN echo ${JAR_FILE_NAME} 
---> Using cache 
---> xxxxxxxxx 
Step 12 : ADD ${JAR_FILE_NAME} app.jar 
---> Using cache 
---> xxxxxxxxx 
Step 13 : RUN bash -c 'touch /app.jar' 
---> Using cache 
---> xxxxxxxxx 
Step 14 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar 
---> Using cache 
---> xxxxxxxxx 
Successfully built xxxxxxxxx 
[INFO] Built xxx/myservice 

输出同时拉动图像:

I0603 13:48:32.849159 23106 exec.cpp:132] Version: 0.23.0 
I0603 13:48:32.857393 23114 exec.cpp:206] Executor registered on slave 20170523-104056-1453378314-5050-11670-S48 
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning. 
Error: Invalid or corrupt jarfile /app.jar 

回答

0

我用这种方法参数化了Docker镜像中使用的输出jar。

  1. 在Dockerfile中,使用了一个没有任何版本的具体名称。从Dockerfile中删除了${JAR_FILE_NAME},动态参数。

ADD myservice.jar app.jar

  • 在pom.xml中,我发行家来输出伪影,而不版本中的jar文件名,右下标签添加以下元素。
  • <finalName>${project.artifactId}</finalName>

    因此,需要Dockerfile没有手动更新。忘记更新Dockerfile然后构建失败真是令人不安。我让Maven管理版本,并将这些版本用作有限图像标签,因此“可重复构建”适用于我。

    0

    你为什么不使用常规的docker build命令,而不是通过行家去?你甚至可以使用一个maven的基础镜像,如maven:onbuildexample here可能会有所帮助。

    +0

    我有一大堆Maven和质量盖茨的东西在Jenkins CI服务器上运行。此外,基本图像是应该使用的“自定义”图像。所以现在不能移出maven! :( – bkrish