在添加文件目录时,docker可以重用缓存的图层吗?

时间:2018-07-13 02:00:31

标签: docker pip

我们的一个docker构建始终没有在CI上重用缓存层。我删除了一些不相关的部分。

FROM python:2.7.11
WORKDIR /code
RUN pip install "pip==9.0.3" "setuptools==39.2.0" && pip install "pipenv==2018.7.1"
ADD requirements/ /code/requirements/
RUN pip install -r requirements/docker.txt
ADD . /code

以及构建输出:

Step 5/9 : WORKDIR /code
 ---> Using cache
 ---> 2b9b8888fcbd
Step 6/9 : RUN pip install "pip==9.0.3" "setuptools==39.2.0" && pip install "pipenv==2018.7.1"
 ---> Using cache
 ---> 5e671bccc3d9
Step 7/9 : ADD requirements/ /code/requirements/
 ---> 7d6b63768850
Removing intermediate container 659522aa0ad1
Step 8/9 : RUN pip install -r requirements/docker.txt
 ---> Running in 6ff743d5e9b4

requirements/中的文件均未更改,但Docker仍选择重建该层。该目录中有5个文件。

我怀疑如果添加目录而不是单个文件,则docker可能会忽略缓存,但是我找不到任何信息来证明或反驳该理论。

编辑:

一个接一个地发出2个构建命令,另一个确实使用缓存。该问题仅在克隆回购协议的CI(Jenkins)上出现。

每天都有很多PR,它们是由单独的Jenkins奴隶(使用共享的docker主机)构建的,它们可能会浪费彼此的缓存。不过,这是一个单独的问题和调查。

1 个答案:

答案 0 :(得分:2)

ADDCOPY命令可用于构建缓存。 Docker在要添加的目录内容上计算哈希,如果该哈希与先前的副本不匹配,则它将不使用先前的哈希。此哈希包含文件上的元数据,包括所有权和权限。构建图像后,可以使用docker history命令查看哈希值,以查看其是否更改。