从特定的步骤重builddocker图像

我有下面的Dockerfile。

FROM ubuntu:14.04 MAINTAINER Samuel Alexander <samuel@alexander.com> RUN apt-get -y install software-properties-common RUN apt-get -y update # Install Java. RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections RUN add-apt-repository -y ppa:webupd8team/java RUN apt-get -y update RUN apt-get install -y oracle-java8-installer RUN rm -rf /var/lib/apt/lists/* RUN rm -rf /var/cache/oracle-jdk8-installer # Define working directory. WORKDIR /work # Define commonly used JAVA_HOME variable ENV JAVA_HOME /usr/lib/jvm/java-8-oracle # JAVA PATH ENV PATH /usr/lib/jvm/java-8-oracle/bin:$PATH # Install maven RUN apt-get -y update RUN apt-get -y install maven # Install Open SSH and git RUN apt-get -y install openssh-server RUN apt-get -y install git # clone Spark RUN git clone https://github.com/apache/spark.git WORKDIR /work/spark RUN mvn -DskipTests clean package # clone and build zeppelin fork RUN git clone https://github.com/apache/incubator-zeppelin.git WORKDIR /work/incubator-zeppelin RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests # Install Supervisord RUN apt-get -y install supervisor RUN mkdir -p var/log/supervisor # Configure Supervisord COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # bash RUN sed -is#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd EXPOSE 8080 8082 CMD ["/usr/bin/supervisord"] 

虽然build设形象,它在第23步失败,即RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests

现在,当我重build它开始build立从步骤23docker正在使用caching。

但是,如果我想重build步骤21的图像即RUN git clone https://github.com/apache/incubator-zeppelin.git

我怎样才能做到这一点? 是删除caching的图像是唯一的select? 有没有额外的参数来做到这一点?

您可以重build整个事情,而不使用caching做一个

 docker build --no-cache -t user/image-name 

要强制从特定行开始重新运行,您可以传递一个未被使用的arg:

 FROM ubuntu:14.04 MAINTAINER Samuel Alexander <samuel@alexander.com> ARG INCUBATOR_VER=unknown RUN apt-get -y install software-properties-common RUN apt-get -y update # Install Java. RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections RUN add-apt-repository -y ppa:webupd8team/java RUN apt-get -y update RUN apt-get install -y oracle-java8-installer RUN rm -rf /var/lib/apt/lists/* RUN rm -rf /var/cache/oracle-jdk8-installer # Define working directory. WORKDIR /work # Define commonly used JAVA_HOME variable ENV JAVA_HOME /usr/lib/jvm/java-8-oracle # JAVA PATH ENV PATH /usr/lib/jvm/java-8-oracle/bin:$PATH # Install maven RUN apt-get -y update RUN apt-get -y install maven # Install Open SSH and git RUN apt-get -y install openssh-server RUN apt-get -y install git # clone Spark RUN git clone https://github.com/apache/spark.git WORKDIR /work/spark RUN mvn -DskipTests clean package # clone and build zeppelin fork RUN INCUBATOR_VER=${INCUBATOR_VER} git clone https://github.com/apache/incubator-zeppelin.git WORKDIR /work/incubator-zeppelin RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests # Install Supervisord RUN apt-get -y install supervisor RUN mkdir -p var/log/supervisor # Configure Supervisord COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # bash RUN sed -is#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd EXPOSE 8080 8082 CMD ["/usr/bin/supervisord"] 

然后运行一个独特的参数:

 docker build --build-arg INCUBATOR_VER=20160613.2 -t user/image-name . 

另外,为了保持图层的小一些,我build议进行以下更改,在下载和安装完成后,您可以在单个RUN命令中合并清理和删除步骤的次数越多,最终图像的尺寸就越小。 否则,您的图层将包含下载和清理之间的所有中间步骤:

 FROM ubuntu:14.04 MAINTAINER Samuel Alexander <samuel@alexander.com> ARG INCUBATOR_VER=unknown RUN DEBIAN_FRONTEND=noninteractive \ apt-get -y install software-properties-common && \ apt-get -y update # Install Java. RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ add-apt-repository -y ppa:webupd8team/java && \ apt-get -y update && \ DEBIAN_FRONTEND=noninteractive \ apt-get install -y oracle-java8-installer && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ rm -rf /var/cache/oracle-jdk8-installer && \ # Define working directory. WORKDIR /work # Define commonly used JAVA_HOME variable ENV JAVA_HOME /usr/lib/jvm/java-8-oracle # JAVA PATH ENV PATH /usr/lib/jvm/java-8-oracle/bin:$PATH # Install maven RUN apt-get -y update && \ DEBIAN_FRONTEND=noninteractive \ apt-get -y install maven \ openssh-server \ git \ supervisor && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # clone Spark RUN git clone https://github.com/apache/spark.git WORKDIR /work/spark RUN mvn -DskipTests clean package # clone and build zeppelin fork RUN INCUBATOR_VER=${INCUBATOR_VER} git clone https://github.com/apache/incubator-zeppelin.git WORKDIR /work/incubator-zeppelin RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests # Configure Supervisord RUN mkdir -p var/log/supervisor COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # bash RUN sed -is#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd EXPOSE 8080 8082 CMD ["/usr/bin/supervisord"] 

一种解决方法:

  1. find您要执行的步骤。
  2. 在那之前,把一个简单的虚拟操作,如“RUN pwd”

然后build立你的Dockerfile。 它会把所有的东西都从高速caching中取出,然后在虚拟命令之后执行这些行。

如果在顶部放置ARG INCUBATOR_VER = unknown,那么在从命令行更改INCUBATOR_VER的情况下将不会使用caching(只是testing了构build)。 对我而言:

 # The rebuild starts from here ARG INCUBATOR_VER=unknown RUN INCUBATOR_VER=${INCUBATOR_VER} git clone https://github.com/apache/incubator-zeppelin.git 

要完成德米特里的答案,你可以使用uniq arg像date +%s来保持总是相同的命令

docker build –build-arg DUMMY = date +%s -t me / myapp:1.0.0

Dockerfile:

 ... ARG DUMMY=unknown RUN DUMMY=${DUMMY} git clone xxx ...