我在CircleCI上运行docker时遇到缓存COPY命令的问题。

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

Docker best practice docs状态:



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

为了进行调试,我正在输出要尝试在本地复制的文件的md5校验和,然后从docker容器中输出并正确匹配。因此,理论上应该加载缓存。我不确定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

这是构建输出的校验和步骤:
$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不缓存?

最佳答案

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东西。我都不想缓存我的实际源代码)

10-08 08:58
查看更多