代码之家  ›  专栏  ›  技术社区  ›  Josh Smeaton

Docker可以在添加文件目录时重用缓存层吗?

  •  0
  • Josh Smeaton  · 技术社区  · 6 年前

    我们的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可能会忽略缓存,但我找不到任何信息来证明或反驳这一理论。

    编辑:

    一个接一个地发出两个构建命令 正确使用缓存。这个问题只出现在CI(Jenkins)上,在那里它复制了回购协议。

    每天都有许多PRS被构建,从单独的Jenkins奴隶(使用共享的Docker主机)中分离出来,它们可能会互相丢弃缓存。不过,这是一个单独的问题和调查。

    1 回复  |  直到 6 年前
        1
  •  2
  •   BMitch    6 年前

    这个 ADD COPY 命令可以使用生成缓存。Docker对要添加的目录内容计算哈希,如果哈希与前一个副本不匹配,则不会使用前一个哈希。这个哈希包括文件上的元数据,包括所有权和权限。您可以使用 docker history 命令在生成图像后查看它是否更改。