2016-02-02 6 views
11

Mam poniżej plik Dockerfile.Przebudowanie obrazu dokowanego z określonego kroku

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

Budując wizerunek nie udało się w kroku 23 tj

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

Teraz kiedy odbudować zaczyna budować od kroku 23 jako doker wykorzystuje pamięć podręczną.

Ale jeśli chcę odbudować wizerunek od kroku 21 tj

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

W jaki sposób można to zrobić? Czy usunięcie obrazu z pamięci podręcznej jest jedyną opcją? Czy jest do tego jakiś dodatkowy parametr?

+0

można utworzyć Dockerfile że przechodzi do etapu 21, oznacz to zdjęcie nazwą, np. krok 21, i utwórz kolejny plik Dockerfile rozpoczynający się od 'Z kroku21' – user2915097

+1

jest taki sam jak https: // stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands/35135412 # 35135412 – user2915097

Odpowiedz

14

Można odbudować całą rzecz bez używania pamięci podręcznej wykonując

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

Aby wymusić powtórzenie założeń wychodząc na określonej linii, można przekazać argumentu, że jest inaczej niewykorzystana:

FROM ubuntu:14.04 
MAINTAINER Samuel Alexander <[email protected]> 
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"] 

a potem po prostu go uruchomić z unikalnym Arg

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

Na marginesie, polecam następujące zmiany, aby zmniejszyć liczbę warstw, im więcej scalania i usuwania kroków na pojedynczej komendzie RUN po pobraniu i zainstalowaniu, tym mniejszy będzie ostateczny obraz. W przeciwnym razie warstwy będą obejmować wszystkie etapy pośrednie pomiędzy pobrania i Czyszczenie:

FROM ubuntu:14.04 
MAINTAINER Samuel Alexander <[email protected]> 
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"] 
+0

W pewnym sensie użyłem czegoś podobnego do twojego podejścia do budowania z określonego kroku. Dzięki za boczną notatkę. To naprawdę pomocne – sag

14

Jeden obejście:

  1. Zlokalizuj krok chcesz wykonać z.
  2. Przed tym etapie umieścić prosta operacja jak manekin „RUN pwd”

Następnie wystarczy zbudować Dockerfile. Z pamięci podręcznej zajmie to wszystko aż do tego kroku, a następnie wykonanie linii po komendzie dummy.

+0

Mimo hackish, działa to zaskakująco dobrze. – Shayne

+0

To jest naprawdę pomocne. Gdzie jest to udokumentowane (lub innymi słowy, dlaczego tak się dzieje?) – Dror

+0

Zdałem sobie sprawę, że to nie jest to, czego potrzebowałem. Pomaga tylko przy pierwszej kompilacji po zmianie ... Ale to nie pomaga, kiedy uruchamia dalsze kompilacje ... – Dror

2

Jeśli miejsce ARG INCUBATOR_VER=unknown w górę, a następnie cache nie będą stosowane w przypadku zmiany INCUBATOR_VER z linii poleceń (tylko testowałem build). Dla mnie pracował:

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

Aby zakończyć odpowiedź Dmitry, można użyć uniq arg jak date +%s zachować zawsze taki sam commanline

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

Dockerfile:

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