通过从命令行传递 jar 文件名来参数化 docker 构建
Parameterize docker build by passing jar file name from command line
我试图在 docker 构建中参数化最终的 jar 文件名。我需要 docker-maven-plugin 来获取通过命令行参数传递的 jar 文件名。 Maven 构建在构建图像时没有抛出任何错误。
如果我在 docker 文件中硬编码 jar 文件名,它工作正常。
Maven 命令 docker 构建:
mvn -X -s settings.xml docker:build -DJAR_FILE_NAME=${filename}
我的 docker 文件:
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>
docker 构建过程的输出:
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
为什么不使用常规 docker build
命令而不是通过 maven?您可以使用 Maven 基础映像,甚至 maven:onbuild
之类的东西。 example here 可能会有所帮助。
我用这种方式参数化了要在docker图像中使用的输出jar。
- 在Dockerfile中,使用了没有任何版本的具体名称。从 Dockerfile 中删除了
${JAR_FILE_NAME}
个动态参数。
ADD myservice.jar app.jar
- 在 POM.xml 中,我通过在标签下添加以下元素,使 maven 输出 jar 文件名中没有版本的工件。
<finalName>${project.artifactId}</finalName>
因此,Dockerfile 无需手动更新。忘记更新 Dockerfile 然后构建失败真是令人不安。我让 Maven 管理版本,这些版本用作有限图像标签,因此 "reproducible builds" 对我有用。
我试图在 docker 构建中参数化最终的 jar 文件名。我需要 docker-maven-plugin 来获取通过命令行参数传递的 jar 文件名。 Maven 构建在构建图像时没有抛出任何错误。
如果我在 docker 文件中硬编码 jar 文件名,它工作正常。
Maven 命令 docker 构建:
mvn -X -s settings.xml docker:build -DJAR_FILE_NAME=${filename}
我的 docker 文件:
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>
docker 构建过程的输出:
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
为什么不使用常规 docker build
命令而不是通过 maven?您可以使用 Maven 基础映像,甚至 maven:onbuild
之类的东西。 example here 可能会有所帮助。
我用这种方式参数化了要在docker图像中使用的输出jar。
- 在Dockerfile中,使用了没有任何版本的具体名称。从 Dockerfile 中删除了
${JAR_FILE_NAME}
个动态参数。
ADD myservice.jar app.jar
- 在 POM.xml 中,我通过在标签下添加以下元素,使 maven 输出 jar 文件名中没有版本的工件。
<finalName>${project.artifactId}</finalName>
因此,Dockerfile 无需手动更新。忘记更新 Dockerfile 然后构建失败真是令人不安。我让 Maven 管理版本,这些版本用作有限图像标签,因此 "reproducible builds" 对我有用。