【问题标题】:Can Travis CI cache docker images?Travis CI 可以缓存 docker 图像吗?
【发布时间】:2020-07-06 17:00:37
【问题描述】:

是否可以在 travis 配置中的任何位置添加设置以缓存我的 docker 图像?我的是一个更大的 docker 镜像,它需要一段时间才能下载。

有什么建议吗?

【问题讨论】:

标签: caching docker travis-ci


【解决方案1】:

今天(2019 年 10 月)最简单的解决方案是将以下内容添加到 .travis.yml:

cache:
  directories:
  - docker_images

before_install:
- docker load -i docker_images/images.tar || true

before_cache:
- docker save -o docker_images/images.tar $(docker images -a -q)

【讨论】:

  • 这确实有效,但可能值得注意的是,上述步骤都有附加成本。在我的特殊情况下,存储和加载 travis 缓存本身并执行 docker store 和 docker load 实际上总共花费了更多时间,而不是仅仅重建图像。因此,上述方法可能仅在缓存层相对较小但构建成本较高的情况下才有用,例如在使用慢速编译器编译相对较小的二进制文件时等。
【解决方案2】:

请参阅Caching Docker Images on Build #5358 以获取答案。对于 Travis 上现在可用的 Docker 1.12,建议manually cache the images。对于 Docker 1.13,您可以在 Travis 上使用其 --cache-from。

保存:

before_cache:
  # Save tagged docker images
  - >
    mkdir -p $HOME/docker && docker images -a --filter='dangling=false' --format '{{.Repository}}:{{.Tag}} {{.ID}}'
    | xargs -n 2 -t sh -c 'test -e $HOME/docker/$1.tar.gz || docker save $0 | gzip -2 > $HOME/docker/$1.tar.gz'

加载:

before_install:
  # Load cached docker images
  - if [[ -d $HOME/docker ]]; then ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load"; fi

还需要声明一个缓存文件夹:

cache:
  bundler: true
  directories:
    - $HOME/docker

【讨论】:

  • 您介意将代码添加到您的答案中吗?链接可能会在某些时候断开。
  • 对不起,之前没有看到你的评论;现在有很多不同了(链接仍然有效)所以我会保持原样
【解决方案3】:

不建议缓存 Docker 镜像,此处参考 Travis 文档 https://docs.travis-ci.com/user/caching/#things-not-to-cache

【讨论】:

  • Travis 文档听起来已经过时了。
【解决方案4】:

我刚刚发现article 中讨论的以下方法。

services:
  - docker

before_script:
  - docker pull myorg/myimage || true
script:
  - docker build --pull --cache-from myorg/myimage --tag myorg/myimage .
  - docker run myorg/myimage

after_script:
  - docker images

before_deploy:
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
deploy:
  provider: script
  script: docker push myorg/myimage
  on:
    branch: master

【讨论】:

  • 在构建之间不缓存图像
【解决方案5】:

这对我有用:

  • 更新所需的 docker 映像名称,而不是 <IMAGE_NAME_HERE>(3 个位置)。
  • 您也可以对多个图像使用相同的配置,docker save 可以处理多个图像,只需确保在尝试保存之前拉取它们。
services:
  - docker

cache:
  directories:
    - docker-cache

before_script:
  - |
    filename=docker-cache/saved_images.tar
    if [[ -f "$filename" ]]; then docker load < "$filename"; fi
    mkdir -p docker-cache
    docker pull <IMAGE_NAME_HERE>
    docker save -o "$filename" <IMAGE_NAME_HERE>

script:
  - docker run <IMAGE_NAME_HERE>...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2022-07-27
    相关资源
    最近更新 更多