控制Docker开始增量构build的地方(用例:Dockerfile中的git clone)
据我所知, docker build
是增量构build图像的智能,即只编译发生变化的图层。 例如,如果Dockerfile
的COPY
语句的源文件Dockerfile
更改,并且其他内容保持不变,那么Docker将只执行从该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_REPOSITORY
, HEAD
都会收到一个新的(散列)值。 如果发生这种情况,它会从ARG HEAD
之后的行开始“增量”构build。 关键的事实是来自Dockerfile参考 ( ARG
, 构buildcaching的影响部分)的这句话:
如果Dockerfile定义了一个ARGvariables,其值与以前的版本不同,那么在第一次使用时会发生“caching未命中”,而不是其定义。 尤其是,ARG指令之后的所有RUN指令隐式使用ARGvariables(作为环境variables),因此可能导致caching未命中。
这表明ARG HEAD
必须尽可能放在Dockerfile
中。 即使它是一个定义,并且可以自行放置,它后面的所有RUN
语句已经算作HEAD
用法。 因此,在我的示例中,重要的是将其放在RUN apt-get
s的冗长安装之后。