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无效,并重复该步骤和之后的步骤。
- dynamic获取由docker-compose创build的正在运行的容器名称
- Docker:尝试连接到本地CircleCI构build的Docker Daemon时拒绝了权限
- Docker和CircleCI 2.0的高uid错误问题
- CircleCI'./docker-compose.yml'服务'版本'没有任何configuration选项
- Exec不受lxc驱动程序的支持:如何解决这个问题?
- CircleCI 2.0的configuration问题 – json:不能将string解组成Gotypes的config.JobDescriptiontypes的值
- Android Espresso:java.lang.IncompatibleClassChangeError:类“java.lang.Class”没有实现接口“java.util.Collection”
- 是否有可能使用CircleClip没有命名为“Dockerfile”的Dockerfile?
- 在circleCI上运行docker-containertesting