2016-02-02 19 views
11

Tôi có Dockerfile bên dưới.xây dựng lại hình ảnh docker từ bước cụ thể

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

Trong khi xây dựng hình ảnh nó đã thất bại trong bước 23 ví dụ:

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

Bây giờ khi tôi xây dựng lại nó bắt đầu xây dựng từ bước 23 như Docker đang sử dụng bộ nhớ cache.

Nhưng nếu tôi muốn xây dựng lại hình ảnh từ bước 21 ví dụ:

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

Làm thế nào tôi có thể làm điều đó? Việc xóa hình ảnh đã lưu trong bộ nhớ cache có phải là tùy chọn duy nhất không? Có thông số bổ sung nào để thực hiện điều đó không?

+0

Bạn có thể tạo một Dockerfile rằng chuyển sang bước 21, gắn thẻ hình ảnh này với tên như bước 21 và tạo một Dockerfile khác bắt đầu bằng 'FROM step21' – user2915097

+1

cũng giống như https: // stackoverflow.com/questions/35134713/disable-cache-cho-specific-run-commands/35135412 # 35135412 – user2915097

Trả lời

14

Bạn có thể xây dựng lại toàn bộ điều mà không sử dụng bộ nhớ cache bằng cách thực hiện một

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

Để buộc một chạy lại bắt đầu từ một dòng cụ thể, bạn có thể vượt qua một arg đó là trường hợp không sử dụng:

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

Và sau đó chỉ cần chạy nó với một duy nhất arg:

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

Ngoài ra, tôi khuyên bạn nên thực hiện các thay đổi sau để giữ cho lớp của bạn nhỏ hơn, bạn càng có thể hợp nhất dọn dẹp và xóa các bước trên một lệnh RUN sau khi tải xuống và cài đặt, hình ảnh cuối cùng của bạn càng nhỏ. Nếu lớp bạn sẽ bao gồm tất cả các bước trung gian giữa việc tải xuống và dọn dẹp:

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

Tôi đã sử dụng một cái gì đó tương tự như cách tiếp cận của bạn để xây dựng từ bước cụ thể. Cảm ơn các lưu ý phụ. Điều đó thực sự hữu ích – sag

14

Một workaround:

  1. Xác định vị trí các bước bạn muốn thực hiện từ.
  2. Trước khi bước mà đặt một hoạt động đơn giản như hình nộm "CHẠY pwd"

Sau đó chỉ cần xây dựng Dockerfile của bạn. Nó sẽ đưa tất cả mọi thứ lên đến bước đó từ bộ nhớ cache và sau đó thực hiện các dòng sau lệnh giả.

+0

Mặc dù hackish, nó hoạt động khá tốt. – Shayne

+0

Điều này thực sự hữu ích. Nó được ghi chép ở đâu (hay nói cách khác, tại sao nó lại xảy ra?) – Dror

+0

Tôi nhận ra đó không phải là điều tôi cần. Nó chỉ giúp sau khi xây dựng đầu tiên sau khi thay đổi ... Nhưng nó không giúp đỡ khi chạy thêm xây dựng ... – Dror

2

Nếu nơi ARG INCUBATOR_VER=unknown ở phía trên, sau đó bộ nhớ cache sẽ không được sử dụng trong trường hợp thay đổi INCUBATOR_VER từ dòng lệnh (chỉ kiểm tra việc xây dựng). Đối với tôi làm việc:

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

Để hoàn thành câu trả lời Dmitry, bạn có thể sử dụng uniq arg như date +%s để giữ luôn cùng commanline

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

Dockerfile:

... 
ARG DUMMY=unknown 
RUN DUMMY=${DUMMY} git clone xxx 
... 
Các vấn đề liên quan