Circle CI Docker服务不cachingCOPY

我在CircleCI上运行Docker,并且在cachingCOPY命令时遇到了问题。

Circle CI文档提到已知的caching问题,并build议使用此perl脚本来设置复制的文件上的时间戳以保留caching。

Docker最佳实践文档声明:

在ADD和COPY指令的情况下,文件的内容被放入图像被检查。 具体来说,对文件进行校验和,然后在高速caching查找期间使用校验和。

按照CircleCi的build议,我将caching保存到磁盘,然后在下次testing运行时重新加载。 这似乎是正确的COPYcaching之前的命令。

为了debugging,我正在输出文件的md5校验和,我尝试在本地复制,然后从docker容器中正确匹配。 所以,理论上caching应该加载。 我不确定Docker使用md5作为校验和。

这是我目前的circle.yml:

机器:服务: – docker

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 

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

 $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不caching?

Docker使用TARSUM来决定是否使用caching,这包括文件元数据。 最重要的修改时间…运行一个git克隆将强制它从头开始重build。

要解决这个问题,我使用一个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 

(在我的例子中,所有我想要被caching的东西像requirements.txt文件都是在conf中,除了第二行的Gruntfile的东西。我没有真正的源代码,我想被caching)

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

之所以会发生这种情况,是因为'git clone'将会(写)所有的本地文件,然后也会得到该克隆的时间戳。 由于Docker在COPY或ADD命令中join了所有文件的散列,所以这个散列现在与以前的散列不同。 然后,Docker使该caching无效,并重复该步骤和之后的步骤。