webentwicklung-frage-antwort-db.com.de

Erstellen Sie das Docker-Image von einem bestimmten Schritt aus neu

Ich habe die unten stehende Dockerfile.

FROM ubuntu:14.04
MAINTAINER Samuel Alexander <[email protected]>

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"]

Beim Erstellen des Bildes ist es in Schritt 23 fehlgeschlagen, d.h.

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

Wenn ich es jetzt neu erstelle, wird es ab Schritt 23 erstellt, da der Docker den Cache verwendet.

Aber wenn ich das Bild von Schritt 21 neu erstellen möchte, d.h.

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

Wie kann ich das machen? Ist das Löschen des zwischengespeicherten Bildes die einzige Option? Gibt es dafür zusätzliche Parameter?

41
sag

Sie können die gesamte Sache neu erstellen, ohne den Cache zu verwenden, indem Sie a ausführen

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

Um eine Wiederholung ab einer bestimmten Zeile zu erzwingen, können Sie ein Argument übergeben, das ansonsten nicht verwendet wird. Docker übergibt ARG-Werte als Umgebungsvariablen an Ihren RUN-Befehl. Wenn Sie also einen ARG ändern, ändert sich der Befehl, wodurch der Cache unterbrochen wird. Es ist nicht einmal notwendig, es selbst in der RUN-Zeile zu definieren.

FROM ubuntu:14.04
MAINTAINER Samuel Alexander <[email protected]>

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, changing INCUBATOR_VER will break the cache here
ARG INCUBATOR_VER=unknown
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"]

Und führen Sie es dann einfach mit einem eindeutigen Argument aus:

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

Um das Argument bei jedem Build zu ändern, können Sie einen Zeitstempel als Argument übergeben:

docker build --build-arg INCUBATOR_VER=$(date +%Y%m%d-%H%M%S) -t user/image-name .

oder:

docker build --build-arg INCUBATOR_VER=$(date +%s) -t user/image-name .

Abgesehen davon würde ich die folgenden Änderungen empfehlen, um Ihre Ebenen kleiner zu halten. Je mehr Sie die Bereinigungs- und Löschschritte in einem einzelnen RUN -Befehl nach dem Herunterladen und Installieren zusammenführen können, desto kleiner wird Ihr endgültiges Image . Andernfalls enthalten Ihre Ebenen alle Zwischenschritte zwischen dem Download und der Bereinigung:

FROM ubuntu:14.04
MAINTAINER Samuel Alexander <[email protected]>

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
ARG INCUBATOR_VER=unknown
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

# 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"]
39
BMitch

Eine Problemumgehung:

  1. Suchen Sie den Schritt, von dem aus Sie ausführen möchten.
  2. Vor diesem Schritt setzen Sie eine einfache Dummy-Operation wie "RUN pwd"

Dann erstellen Sie einfach Ihr Dockerfile. Es wird alles bis zu diesem Schritt aus dem Cache genommen und dann die Zeilen nach dem Dummy-Befehl ausgeführt.

37
user6461348

Um die Antwort von Dmitry zu vervollständigen, können Sie uniq arg wie date +%s um immer gleiches Kommando zu haben

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

Dockerfile:

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

Eine einfachere Technik.

Dockerfile:
Fügen Sie diese Zeile hinzu, in der das Caching übersprungen werden soll.

COPY marker /dev/null

Dann bauen Sie mit

date > marker && docker build .

5
Bernard

Wenn Sie ARG INCUBATOR_VER=unknown Oben platzieren, wird der Cache nicht verwendet, wenn Sie INCUBATOR_VER Über die Befehlszeile ändern (haben Sie gerade den Build getestet). Für mich hat gearbeitet:

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