控制Docker开始增量构build的地方(用例:Dockerfile中的git clone)

据我所知, docker build是增量构build图像的智能,即只编译发生变化的图层。 例如,如果DockerfileCOPY语句的源文件Dockerfile更改,并且其他内容保持不变,那么Doc​​ker将只执行从该COPY开始的语句,并以其他方式重新使用以前编译的层。

我有一个场景,我在构build时在Docker镜像中RUN git clone ,并希望docker build build从该语句开始增量构build(如果有任何源文件已更改)。

我想我可以通过在该语句之前放置一个COPY dummy /来执行此操作,并告诉Docker关于带有touch dummy源文件的更改。 有一个更好的方法吗?

看看Dockerfiles中的ARG指令。 具体来说这个部分对构buildcaching有影响 。

我已经能够通过@JHarris的领导来解决这个问题。 我的Dockerfile现在看起来像这样:

 FROM ... ARG ... ENV ... # run lengthy installs RUN apt-get update RUN apt-get install -y ... # ... ARG HEAD RUN TMP_DIR=$(mktemp -d) && \ cd $TMP_DIR && \ git clone $GIT_REPOSITORY && \ # compile source code # install from compile cd $TMP_DIR && \ rm -fr $TMP_DIR # ... 

我开始构build过程:

 docker build --build-arg HEAD=$(git ls-remote $GIT_REPOSITORY refs/heads/master | \ cut -f1) . 

实际上,无论何时发生新的$GIT_REPOSITORYHEAD都会收到一个新的(散列)值。 如果发生这种情况,它会从ARG HEAD之后的行开始“增量”构build。 关键的事实是来自Dockerfile参考 ( ARG构buildcaching的影响部分)的这句话:

如果Dockerfile定义了一个ARGvariables,其值与以前的版本不同,那么在第一次使用时会发生“caching未命中”,而不是其定义。 尤其是,ARG指令之后的所有RUN指令隐式使用ARGvariables(作为环境variables),因此可能导致caching未命中。

这表明ARG HEAD必须尽可能放在Dockerfile中。 即使它是一个定义,并且可以自行放置,它后面的所有RUN语句已经算作HEAD用法。 因此,在我的示例中,重要的是将其放在RUN apt-get s的冗长安装之后。