Circle CI Docker服务不会缓存COPY

时间:2015-01-13 23:22:43

标签: docker circleci

我正在CircleCI上运行泊坞广告,而且我无法缓存COPY命令。

Circle CI文档提到了known caching issues,并建议使用this perl script设置复制文件的时间戳以保留缓存。

Docker best practice docs州:

  

在ADD和COPY指令的情况下,内容   检查放入图像的文件。具体来说,一个   校验和完成文件,然后在期间使用校验和   缓存查找。

根据CircleCi的建议,我将缓存保存到磁盘,然后在下次测试运行时再次加载。这似乎在COPY高速缓存正确之前作为命令工作。

要进行调试,我输出我尝试在本地复制的文件的md5校验和,然后从docker容器中输出并正确匹配。因此,理论上缓存应该加载。我不确定Docker是否使用md5作为校验和。

这是我目前的circle.yml:

机:   服务:      - 码头工人

dependencies:
  cache_directories:
    - "~/docker"
  pre:
    - mkdir -p ~/docker
  override:
    - docker info
    - if [[ -e ~/docker/image.tar ]]; then docker load -i ~/docker/image.tar; fi
    - docker images
    - docker build -t circles .

checkout:
  post:
    - ls -l
    - ./timestamp-set-to-git.pl
    - ls -l

test:
  override:
    - md5sum .bowerrc
    - docker run circles md5sum .bowerrc
    - docker save circles > ~/docker/image.tar

这是校验和步骤的构建输出:

$md5sum .bowerrc
8d1a712721d735bd41bf738cae3226a2 .bowerrc

$docker run circles md5sum .bowerrc
8d1a712721d735bd41bf738cae3226a2 .bowerrc

但是docker build报告了这一点:

Step 6 : RUN sudo npm install -g phantomjs gulp
 ---> Using cache
 ---> a7bbf2b17977
Step 7 : COPY .bowerrc /var/work/.bowerrc
 ---> 7ad82336de64

有谁知道为什么COPY没有缓存?

2 个答案:

答案 0 :(得分:3)

Docker使用TARSUM来决定是否使用缓存,这包括文件元数据。修改时间最重要的是...运行git clone将迫使它从头开始重建。

要解决此问题,我使用带有以下目标的Makefile ...

build: hack-touch
    docker build -t MYTAG .
hack-touch:
    @echo "Reset timestamps on git working directory files..."
    find conf | xargs touch -t 200001010000.00
    touch -t 200001010000.00 Gruntfile.js bower.json package.json .bowerrc

(在我的例子中,我想要缓存的所有内容,例如requirements.txt文件都在conf中,除了第二行的Gruntfile内容。我想要缓存的实际源代码都没有。)

答案 1 :(得分:1)

我使用drone.io(另一个CI工具)遇到了同样的问题。

发生这种情况的原因是'git clone'将(覆盖)写入所有本地文件,然后还将获得该克隆时间的时间戳。由于Docker获取了在COPY或ADD命令中添加的所有文件的哈希值,因此该哈希值现在与之前的哈希值不同。 Docker然后使该缓存无效并重做该步骤以及之后的步骤。