【问题标题】:Circle CI Docker service does not cache COPYCircle CI Docker 服务不缓存 COPY
【发布时间】:2015-06-29 09:51:54
【问题描述】:

我在 CircleCI 上运行 docker,但在缓存 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 不缓存吗?

【问题讨论】:

  • 嗨 Rimian,我遇到了同样的问题并正在寻找解决方案。当我构建我的 Docker 容器时,我想使用 COPY 命令从容器内的 GIT repro 复制文件。有时它工作,有时没有。找到解决方案后告诉我。
  • COPY 之前的步骤被 docker 缓存,因为它实际上只在 RUN 之后对字符串进行哈希处理

标签: docker circleci


【解决方案1】:

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

(就我而言,除了第二行的 Gruntfile 文件之外,我想要缓存的所有内容(如 requirements.txt 文件)都在 conf 中。我不想缓存任何实际源代码)

【讨论】:

  • 文件修改和访问时间戳元数据不再影响缓存。通过文档链接查看我的答案。 here
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多