Docker Hub镜像构建错误:returned a non-zero code: 8
对于同一个Dockerfile,Docker Hub不同时间来进行构建会出现不同的结果,如下构建Tomcat的镜像为例:
# 基于centos6基础镜像
FROM centos:6
MAINTAINER chenyufeng "yufengcode@gmail.com"
# 设置当前工具目录
# 该命令不会新增镜像层
WORKDIR /home
# 安装必要的工具
RUN yum install -y wget && \
????rpm --rebuilddb && \
????yum install -y tar && \
????wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && \
????tar -xvzf jdk-8u131-linux-x64.tar.gz && \
????wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.48/bin/apache-tomcat-8.0.48.tar.gz && \
????tar -xvzf apache-tomcat-8.0.48.tar.gz && \
????mv apache-tomcat-8.0.48/ tomcat && \
????rm -f jdk-8u131-linux-x64.tar.gz && \
????rm -f apache-tomcat-8.0.48.tar.gz && \????
????ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
????yum clean all
# 设置环境变量
ENV JAVA_HOME /home/jdk1.8.0_131
ENV CATALINA_HOME /home/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
ENV TZ Asia/Shanghai
# 暴露tomcat 8080端口
EXPOSE 8080
# 启动容器执行下面的命令
ENTRYPOINT /home/tomcat/bin/startup.sh && tail -f /home/tomcat/logs/catalina.out
# 创建容器启动tomcat,由于ENTRYPOINT优先级比CMD高,所以这里的CMD不会执行
CMD ["/home/tomcat/bin/startup.sh"]
在3个月前构建成功(约2018年1月),但是2个月前就构建失败了(月2018年2月),期间镜像文件没有做任何的修改。
构建失败后报错如下:
Build failed: The command '/bin/sh -c yum install -y wget && rpm --rebuilddb && yum install -y tar && wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && tar -xvzf jdk-8u131-linux-x64.tar.gz && wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.48/bin/apache-tomcat-8.0.48.tar.gz && tar -xvzf apache-tomcat-8.0.48.tar.gz && mv apache-tomcat-8.0.48/ tomcat && rm -f jdk-8u131-linux-x64.tar.gz && rm -f apache-tomcat-8.0.48.tar.gz && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && yum clean all' returned a non-zero code: 8
这是因为Docker Hub其实也会不定期的修改源,可能今天能下载某个包,但是明天可能就不能下载了。问题就出现在镜像文件中的jdk和tomcat,由于几个月过去了,上面的jdk、tomcat版本已经比较旧了,导致Docker Hub下载失败。所以如果出现“returned a non-zero code: 8”这种问题,很有可能是镜像文件中的某些软件版本很老了,导致Docker Hub下载失败。所以镜像文件并不是写完就一劳永逸了,也是要不断进行更新的。修改上述的Dockerfile如下就可以构建成功了:
# 基于centos6基础镜像
FROM centos:6
MAINTAINER chenyufeng "yufengcode@gmail.com"
# 设置当前工具目录
# 该命令不会新增镜像层
WORKDIR /home
# 安装必要的工具
RUN yum install -y wget && \
????rpm --rebuilddb && \
????yum install -y tar && \
????wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz && \
????tar -xvzf jdk-8u162-linux-x64.tar.gz && \
????wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.29/bin/apache-tomcat-8.5.29.tar.gz && \
????tar -xvzf apache-tomcat-8.5.29.tar.gz && \
????mv apache-tomcat-8.5.29/ tomcat && \
????rm -f jdk-8u162-linux-x64.tar.gz && \
????rm -f apache-tomcat-8.5.29.tar.gz && \????
????ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
????yum clean all
# 设置环境变量
ENV JAVA_HOME /home/jdk1.8.0_162
ENV CATALINA_HOME /home/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
ENV TZ Asia/Shanghai
# 暴露tomcat 8080端口
EXPOSE 8080
# 启动容器执行下面的命令
ENTRYPOINT /home/tomcat/bin/startup.sh && tail -f /home/tomcat/logs/catalina.out
# 创建容器启动tomcat,由于ENTRYPOINT优先级比CMD高,所以这里的CMD不会执行
CMD ["/home/tomcat/bin/startup.sh"]
也就是把jdk和tomcat提高到当前版本下的最新更新。还需要注意的是,在每一次修改Dockerfile后进行构建,不仅要构建latest版本,还要构建指定具体版本号1.*的版本。也就是一定要对镜像本身进行版本控制和release。