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?
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"]
Une seule solution:
- Localiser l'étape que vous souhaitez exécuter.
- 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.
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
...
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
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 .