问题描述
在使用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文件是否正确。
正文完