Docker构建未使用构建的jar

33次阅读
没有评论

问题描述

在使用Jenkins和Docker构建流水线时遇到了问题。他使用以下命令在Jenkins中构建Docker镜像:

docker build -f Dockerfile --build-arg jenkins_jar_file=${JENKINS_JAR_FILE} -t ${DOCKER_IMAGE} .

其中JENKINS_JAR_FILE是一个指向Jenkins生成的jar文件的变量。
以下是他的Dockerfile内容:

FROM ~~container_on_private_registry~~
USER root
WORKDIR /root
ARG jenkins_jar_file
RUN mkdir -p /root/app
COPY ${jenkins_jar_file} /root/app/app.jar
ENTRYPOINT ["java", "-jar", "/root/app/app.jar"]

然而,他感觉镜像没有使用正确的jar文件构建。当他运行docker images命令时,看到了自己的镜像,但是显示”Created 4 Days ago”。当他运行docker images history命令时,看到了相同的结果。
当他尝试运行镜像时,出现了一个奇怪的错误,它试图运行一个在镜像中不存在的jar文件。而是返回以下错误:/root/app-1.0-20180729.204127-14

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据回答1,你的Dockerfile应该像这样:

FROM ~~container_on_private_registry~~
USER root
WORKDIR /root
ARG jenkins_jar_file
ENV jenkins_jar_file ${jenkins_jar_file}
RUN mkdir -p /root/app
COPY ${jenkins_jar_file} /root/app/app.jar
ENTRYPOINT ["java", "-jar", "/root/app/app.jar"]

解释:
我们告诉Dockerfile让Docker知道,在构建过程中需要传递一个名为jenkins_jar_file的变量。后续的行可以使用$符号引用该变量。
在构建镜像时,使用--no-cache参数,这样它将重新构建镜像的所有层。

方案2

根据回答2,你可以在构建之前添加一步,列出jar文件以确保这是正确的jar文件,然后将它们复制到Dockerfile所在的位置并运行构建。

总结

在使用Jenkins和Docker构建流水线时,确保Dockerfile正确引用了jar文件,并使用正确的构建命令和参数。如果遇到问题,可以尝试使用--no-cache参数重新构建镜像,或者在构建之前检查jar文件是否正确。

正文完