reconstruire l'image du docker à partir d'une étape spécifique

j'ai le fichier Dockerfile ci-dessous.

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 -i s#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd

EXPOSE 8080 8082
CMD ["/usr/bin/supervisord"]

lors de la construction de l'image, elle a échoué à l'étape 23, C.-à-d.

RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests

maintenant, quand je reconstruis, il commence à construire à partir de l'étape 23 Car docker utilise cache.

Mais si je veux reconstruire l'image à partir de l'étape 21 c'est à dire

RUN git clone https://github.com/apache/incubator-zeppelin.git

Comment puis-je le faire? Est-ce que supprimer l'image mise en cache est la seule option? Est-il un paramètre supplémentaire à faire?

19
demandé sur GabLeRoux 2016-02-02 15:58:50

5 réponses

vous pouvez reconstruire la chose entière sans utiliser le cache en faisant un

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

Pour forcer une reprise de celui de départ à une ligne spécifique, vous pouvez passer d'un arg qui est par ailleurs utilisé:

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 -i s#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd

EXPOSE 8080 8082
CMD ["/usr/bin/supervisord"]

Et puis il suffit de l'exécuter avec un unique arg:

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

comme mise à part, je recommande les changements suivants pour garder vos calques plus petits, plus vous pouvez fusionner le nettoyage et supprimer les étapes sur un seul RUN commande après le téléchargement et l'installation, plus votre image finale sera petite. Sinon, vos calques incluront toutes les étapes intermédiaires entre le téléchargement et le nettoyage:

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 -i s#/home/git:/bin/false#/home/git:/bin/bash# /etc/passwd

EXPOSE 8080 8082
CMD ["/usr/bin/supervisord"]
23
répondu BMitch 2018-01-27 15:19:16

Une seule solution:

  1. Localiser l'étape que vous souhaitez exécuter.
  2. avant cette étape mettre une opération simple comme "exécuter pwd"

alors construisez votre fichier Dockerfile. Il prendra tout jusqu'à cette étape à partir du cache et exécutera ensuite les lignes après la commande factice.

27
répondu user6461348 2016-06-13 19:37:01

pour compléter la réponse de Dmitry, vous pouvez utiliser uniq arg comme date +%s pour garder toujours la même commanline

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

Dockerfile:

...
ARG DUMMY=unknown
RUN DUMMY=${DUMMY} git clone xxx
...
5
répondu toms130 2018-01-27 15:19:52

Si le lieu ARG INCUBATOR_VER=unknown en haut, le cache ne sera pas utilisé en cas de changement de INCUBATOR_VER depuis la ligne de commande (vient de tester la construction). Pour moi a fonctionné:

# The rebuild starts from here
ARG INCUBATOR_VER=unknown
RUN INCUBATOR_VER=${INCUBATOR_VER} git clone https://github.com/apache/incubator-zeppelin.git
3
répondu Dmitry Belyaev 2018-01-27 15:19:29

Une technique plus simple.

Dockerfile:

ajouter cette ligne où vous voulez que la mise en cache commence à être sautée.

COPY marker /dev/null

puis construisez en utilisant

date > marker && docker build .

1
répondu Alkaline 2018-04-14 11:48:44