在使用Jenkins的docker-build-step插件构建Dockerfile时,ADD命令失败。

3
以下是我的DockerFile
FROM centos:centos6
MAINTAINER Priyanka

################## Helpful utils
RUN yum -y install sudo
RUN yum -y install curl
RUN yum -y install unzip

################## JDK7

#Note that ADD uncompresses this tarball automatically
ADD jdk-7u79-linux-x64.tar.gz /opt
WORKDIR /opt/jdk1.7.0_79
RUN alternatives --install /usr/bin/java java /opt/jdk1.7.0_79/bin/java 1
RUN alternatives --install /usr/bin/jar jar /opt/jdk1.7.0_79/bin/jar 1
RUN alternatives --install /usr/bin/javac javac /opt/jdk1.7.0_79/bin/javac 1
RUN echo "JAVA_HOME=/opt/jdk1.7.0_79" >> /etc/environment
ENV JAVA_OPTS -Xms1024m -Xmx4196m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m

################## TOMCAT

#Note that ADD uncompresses this tarball automatically
ADD apache-tomcat-7.0.67.tar.gz /usr/share
WORKDIR /usr/share/
RUN mv  apache-tomcat-7.0.67 tomcat7
RUN echo "JAVA_HOME=/opt/jdk1.7.0_79/" >> /etc/default/tomcat7
RUN groupadd tomcat
RUN useradd -s /bin/bash -g tomcat tomcat
RUN chown -Rf tomcat.tomcat /usr/share/tomcat7
EXPOSE 8087

################## ROC Client War Download

RUN curl -O http://10.113.57.164:8080/job/ROC4.0_Client/ws/spark-web/entrypoint/target/entrypoint.war
RUN unzip entrypoint.war -d /usr/share/tomcat7/webapps/roc_client
ADD validation-api-1.1.0.Final.jar /usr/share/tomcat7/webapps/roc_client/WEB-INF/lib/
ADD validation-api-1.1.0.Final-sources.jar /usr/share/tomcat7/webapps/roc_client/WEB-INF/lib/
RUN rm /usr/share/tomcat7/webapps/roc_client/WEB-INF/lib/validation-api-1.0.0.GA-sources.jar 
RUN rm /usr/share/tomcat7/webapps/roc_client/WEB-INF/lib/validation-api-1.0.0.GA.jar

################## Tomcat launch

CMD ["/usr/share/tomcat7/bin/catalina.sh","run"]

在Jenkins中使用docker-build-step构建此文件时,构建会在ADD处失败,并抛出以下异常。
Step 0 : FROM centos:centos6

 ---> 3bbbf0aca359

Step 1 : MAINTAINER Priyanka

 ---> Using cache

 ---> c8055ba8439a

Step 2 : RUN yum -y install sudo

 ---> Using cache

 ---> 203da82ad2af

Step 3 : RUN yum -y install curl

 ---> Using cache

 ---> c6cb08257236

Step 4 : RUN yum -y install unzip

 ---> Using cache

 ---> 688620db641a

Step 5 : ADD jdk-7u79-linux-x64.tar.gz /opt

ERROR: Build step failed with exception
java.lang.RuntimeException: java.lang.ClassCastException: org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl cannot be cast to javax.json.JsonString
    at org.jenkinsci.plugins.dockerbuildstep.cmd.CreateImageCommand.execute(CreateImageCommand.java:139)
    at org.jenkinsci.plugins.dockerbuildstep.DockerBuilder.perform(DockerBuilder.java:75)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:782)
    at hudson.model.Build$BuildExecution.build(Build.java:205)
    at hudson.model.Build$BuildExecution.doRun(Build.java:162)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:534)
    at hudson.model.Run.execute(Run.java:1738)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:98)
    at hudson.model.Executor.run(Executor.java:410)
Caused by: java.lang.ClassCastException: org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl cannot be cast to javax.json.JsonString
    at org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl.getJsonString(JsonObjectBuilderImpl.java:194)
    at org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl.getString(JsonObjectBuilderImpl.java:199)
    at org.jenkinsci.plugins.dockerbuildstep.cmd.CreateImageCommand$1.callback(CreateImageCommand.java:123)
    at org.jenkinsci.plugins.dockerbuildstep.cmd.CreateImageCommand.readJsonStream(CreateImageCommand.java:161)
    at org.jenkinsci.plugins.dockerbuildstep.cmd.CreateImageCommand.execute(CreateImageCommand.java:115)
    ... 10 more
Build step 'Execute Docker command' marked build as failure
Finished: FAILURE

我已经运行了这个构建多次,没有任何问题的成功完成。我对构建配置进行了一些临时更改并恢复了原状。从那时起,它就会抛出此错误。我尝试删除文件中的所有docker命令,仅保留一个RUN命令。仍然存在相同的问题。它无法运行任何docker命令。


以防它是缓存问题,尝试在不使用缓存的情况下重新构建 (docker build --no-cache)。 - VonC
你不应该滥用 RUN 命令,并使用一个单独的 RUN 命令执行不同的安装(utils、JDK7、TOMCAT),从而减少层数,进而减少所需的磁盘空间。可以参考这里的一些示例:https://github.com/jfrazelle/dockerfiles - Auzias
好的。但这会有助于解决问题吗?尝试从文件中删除所有docker命令,只保留一个RUN命令。仍然存在相同的问题。它无法运行任何docker命令。 - Priyanka.Patil
你使用什么命令来构建那个Dockerfile?(我不明白为什么会有Java异常,考虑到Docker是用Go编写的) - VonC
我自己没有调用docker命令。jenkin的docker-build-step-plugin是用Java编写的,它为我执行了这个命令。我尝试自己执行命令,结果也很好。 - Priyanka.Patil
2个回答

0

我知道这已经相当老了,但我遇到了这个问题,并找到了一个不同的解决方案,可能会帮助将来遇到这个问题的其他人。

在我的情况下,我正在使用devicemapper作为存储驱动程序,并且包含thinpool的逻辑卷已经达到90%的容量,此时尝试创建新镜像时会触发警报。这导致Jenkins Docker插件与上面发布的相同堆栈跟踪失败。

从图像存储中删除旧图像解决了问题。


0

我遇到了同样的问题。实际上,你正在寻找的文件并不存在于你的工作空间作业目录中。如果你的docker-step-plugin能够找到这个文件,那么Dockerfile中的ADD命令就会起作用:-) 希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接