我有下面的Dockerfile.
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"]
构建映像时,在步骤23中失败,即
RUN mvn clean package -Pspark-1.6 -Phadoop-2.6 -DskipTests
现在,当我重新构建时,它从第23步开始构建,因为Docker正在使用缓存。
但如果我想从步骤21重建图像,即
RUN git clone https://github.com/apache/incubator-zeppelin.git
我该怎么做呢?删除缓存的图像是唯一的选择吗?有没有其他参数可以做到这一点?
8条答案
按热度按时间kxkpmulp1#
您可以在不使用缓存的情况下重建整个内容,方法是执行
要强制从特定行开始重新运行,您可以传递一个未使用的arg。Docker将ARG值作为环境变量传递给您的RUN命令,因此更改ARG是对命令的更改,这会破坏缓存。您甚至不必在RUN行上自己定义它。
然后用一个唯一的arg运行它:
要在每次构建时更改参数,您可以将时间戳作为arg传递:
或:
顺便说一句,我建议你做以下修改来保持你的图层更小,在下载和安装之后,你可以在一个
RUN
命令中合并清理和删除步骤越多,你的最终图像就越小。否则你的图层将包括下载和清理之间的所有中间步骤:rslzwgfq2#
一种解决方案:
1.找到要从中执行的步骤。
1.在此步骤之前,放置一个简单的虚拟操作,如“RUN pwd”
然后构建你的Dockerfile,它会该高速缓存中提取到这一步的所有内容,然后执行dummy命令之后的行。
c9qzyr3d3#
要完成Dmitry的回答,可以使用uniqarg(如
date +%s
)来始终保持相同的命令行Dockerfile
:fsi0uk1n4#
更简单的方法。
停靠文件:
在希望开始跳过缓存的位置添加此行。
COPY marker /dev/null
然后使用
date > marker && docker build .
czfnxgou5#
另一个选项是删除要重建的缓存中间映像。
在构建输出中找到要重新构建的中间映像的哈希值:
然后删除该图像:
或者如果它给你一个错误,你可以强迫它:
最后,重新运行您的构建命令,它将需要从该点重新启动,因为它不在该高速缓存中。
zlwx9yxi6#
如果将
ARG INCUBATOR_VER=unknown
放在顶部,则在从命令行更改INCUBATOR_VER
的情况下不会使用缓存(刚刚测试了构建版本)。nbysray57#
使用
--cache-from=...
选项并指定最后一个层的哈希值,以便在不重建的情况下重用。所有后续层都将重建。假设我有以下缓存的Docker构建版本:
现在,如果我想强制apt-get stanza重新运行:
ecbunoof8#
由于没有正式的方法来实现这一点,最简单的方法是临时更改特定的RUN命令,使其包含一些无害的内容,如echo:
建造完成后,将其拆除。