web-dev-qa-db-ja.com

特定のステップからドッカーイメージを再構築する

以下の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"]

イメージの構築中に、ステップ23で失敗しました。

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

今、リビルドすると、ドッカーがキャッシュを使用しているため、ステップ23からビルドを開始します。

しかし、ステップ21のイメージを再構築する場合、つまり.

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

どうやってやるの?キャッシュされた画像を削除することが唯一のオプションですか?それを行うための追加のパラメーターはありますか?

41
sag

キャッシュを使用せずに全体を再構築できます

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

特定の行から強制的に再実行するには、それ以外の場合は使用されない引数を渡すことができます。 DockerはRUNコマンドに環境変数としてARG値を渡すため、ARGの変更は、キャッシュを破壊するコマンドの変更です。 RUN行で自分で定義する必要さえありません。

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

そして、ユニークな引数でそれを実行するだけです:

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

ビルドごとに引数を変更するには、タイムスタンプを引数として渡すことができます。

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

または:

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

余談ですが、ダウンロードとインストール後に単一のRUNコマンドでクリーンアップと削除の手順をマージできるほど、レイヤーを小さくするために次の変更をお勧めします。最終イメージは小さくなります。それ以外の場合、レイヤーにはダウンロードとクリーンアップの間のすべての中間ステップが含まれます。

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

1つの回避策:

  1. 実行するステップを見つけます。
  2. そのステップの前に、「RUN pwd」のような単純なダミー操作を配置します

次に、Dockerfileをビルドします。キャッシュからそのステップまでのすべてを取得し、ダミーコマンドの後の行を実行します。

37
user6461348

Dmitryの答えを完了するには、date +%sのようなuniq引数を使用して、常に同じコマンドラインを維持することができます

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

より単純な手法。

Dockerfile:
キャッシュのスキップを開始する場所にこの行を追加します。

COPY marker /dev/null

次に使用してビルド

date > marker && docker build .

5
Bernard

ARG INCUBATOR_VER=unknownを先頭に配置すると、コマンドラインからINCUBATOR_VERを変更した場合、キャッシュは使用されません(ビルドをテストしたばかりです)。私のために働いた:

# 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