我们的一个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主机)构建的,它们可能会浪费彼此的缓存。不过,这是一个单独的问题和调查。
答案 0 :(得分:2)
ADD
和COPY
命令可用于构建缓存。 Docker在要添加的目录内容上计算哈希,如果该哈希与先前的副本不匹配,则它将不使用先前的哈希。此哈希包含文件上的元数据,包括所有权和权限。构建图像后,可以使用docker history
命令查看哈希值,以查看其是否更改。