草庐IT

docker - 大厅 CI : leverage docker image cache

coder 2023-05-06 原文

我完全理解 Concourse 是无状态的,但是有没有办法重用已经拉取的 docker 镜像? 就我而言,我构建了大约 10 个具有相同基础镜像的 docker 镜像,但每次触发构建时,Concourse 都会拉取基础镜像 10 次。

是否可以使用标准 docker 资源提取该图像一次并在以后重新使用它(至少在同一构建范围内)?

是的,应该可以使用自定义图像并在 sh 脚本中对其进行编码,但我不喜欢邀请自行车。

如果标准 docker 资源不允许这样做,是否可以以某种方式扩展它以启用此类行为?

--cache-from 没有帮助,因为 CI 大部分时间都在提取图像,而不是构建新层。

最佳答案

理论

首先,一些 Concourse 理论(至少从 v3.3.1 开始):

人们经常谈论 Concourse 有一个“缓存”,但误解了它的含义。每个大厅工作人员在磁盘上都有一组卷,这些卷留在周围,形成一个卷缓存。此卷缓存包含已由资源 getput 以及任务 outputs 填充的卷。

人们也经常误解 docker-image-resource 如何使用 Docker。您的 Concourse 安装没有运行全局 docker 服务器,实际上 Concourse 容器不是 Docker 容器,它们是 runC 容器。每个 docker-image-resource 进程(checkgetput)都在其自己的 runC 容器中运行,其中有一个本地 docker 服务器正在运行。这意味着没有全局 docker 服务器正在拉取 docker 图像并缓存层以供进一步使用。

这意味着当我们谈论使用 docker-image-resource 进行缓存时,它意味着将图像加载或预拉到本地 docker 服务器中。


练习

现在是优化构建时间的选项:

load_base

背景

docker-image-resource put 中的 load_base 参数告诉资源首先 docker load图像(通过 get 检索)到其本地 docker 服务器,构建通过 put 参数指定的图像。

当您需要将图像预填充到“docker 缓存”中时,这很有用。在您的情况下,您可能希望预加载 FROM 指令中使用的图像。这更有效,因为它使用 Concourse 自己的卷缓存仅拉取“base”一次,使其在执行 FROM 命令期间可供 docker 服务器使用。

用法

您可以使用 load_base 如下:

假设你想构建一个自定义的 python 镜像,并且你有一个带有 ci/Dockerfile 文件的 git 存储库,如下所示:

FROM ubuntu

RUN apt-get update
RUN apt-get install -y python python-pip

如果您想在利用 Concourse 卷缓存 以及 Docker 镜像层缓存 的同时自动构建/推送此镜像:

resources:
- name: ubuntu
  type: docker-image
  source:
    repository: ubuntu

- name: python-image
  type: docker-image
  source:
    repository: mydocker/python

- name: repo
  type: git
  source:
    uri: ...

jobs:
- name: build-image-from-base
  plan:
  - get: repo
  - get: ubuntu
    params: {save: true}
  - put: python-image
    params:
      load_base: ubuntu
      dockerfile: repo/ci/Dockerfile

cache & cache_tag

背景

docker-image-resource put 中的 cachecache_tag 参数告诉资源首先 < em="">从你的远程源中拉一个特定的图像+标签,构建通过你的 put 参数指定的图像。

当下拉图像比从头构建图像更容易时,这很有用,例如您的构建过程非常漫长,例如昂贵的编译

利用了 Concourse 的卷缓存,并利用了 Docker 的 --cache-from 功能(这有可能需要先执行 docker pull ) 在每次 put 期间。

用法

您可以使用 cachecache_tag 如下:

假设你想构建一个自定义的 ruby​​ 镜像,你从源代码编译 ruby​​,并且你有一个带有 ci/Dockerfile 文件的 git 存储库,如下所示:

FROM ubuntu

# Install Ruby
RUN mkdir /tmp/ruby;\
  cd /tmp/ruby;\
  curl ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz | tar xz;\
  cd ruby-2.0.0-p247;\
  chmod +x configure;\
  ./configure --disable-install-rdoc;\
  make;\
  make install;\
  gem install bundler --no-ri --no-rdoc

RUN gem install nokogiri

如果您想自动构建/推送此镜像,同时仅利用 Docker 镜像层缓存:

resources: 
- name: compiled-ruby-image
  type: docker-image
  source:
    repository: mydocker/ruby
    tag: 2.0.0-compiled

- name: repo
  type: git
  source:
    uri: ...

jobs:
- name: build-image-from-cache
  plan:
  - get: repo
  - put: compiled-ruby-image
    params:
      dockerfile: repo/ci/Dockerfile
      cache: mydocker/ruby
      cache_tag: 2.0.0-compiled

推荐

如果你想提高构建 docker 镜像的效率,我个人认为 load_base 应该在大多数情况下使用。因为它使用资源 get,它利用了 Concourse 卷缓存,并且避免了需要做额外的 docker pulls。

关于docker - 大厅 CI : leverage docker image cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44475165/

有关docker - 大厅 CI : leverage docker image cache的更多相关文章

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  2. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  3. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  4. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  5. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  6. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  7. 转转测试环境docker化实践 - 2

        测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境    转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境    随着微服务化的进

  8. Docker启动故障问题 no such file or directory解决方法 - 2

    1.现象服务重启后,通过dockerstart方式无法启动实例,报出错误:Errorresponsefromdaemon:errorcreatingoverlaymountto/var/lib/docker/overlay2/xxx/merged:nosuchfileordirectorydockersave导出镜像也报出2.网上各种尝试摸索无效果修改daemon.json中的storage-driver为overlay,重启无效果。禁用selinux,临时或永久方式都无效果。修改/etc/docker/daemon.json中的storage-driver为overlay2,无效果。修改/l

  9. Docker+HomeAssistant+HACS+设备接入教程 - 2

    homeassistant久仰大名,据说可以一统各大物联网平台的设备,家里各平台的设备都有一点,控制起来很不方便,于是乎我也来尝尝~homeassistant官网https://www.home-assistant.io/HACShttps://github.com/hacs/integration准备1.Linux系统(Window)其实也类似2.安装好dockerdocker安装homeassistant官方有几个版本可供选择,安装方式可以:直接刷HA的系统,也可以用Docker安装,还可以直接安装在物理机上,具体区别如下:我采用的是Docker进行安装,也就是Container,从上图也

  10. ruby - 如何在 Travis CI 的 macOS 中更改 Homebrew 的 Ruby 版本? - 2

    努力奔跑if[["$TRAVIS_OS_NAME"=="osx"]];thenbrewinstallpython3;fi在before_install中,我最终得到了/usr/local/Homebrew/Library/Homebrew/brew.rb:12:in\`':HomebrewmustberununderRuby2.3!(RuntimeError)Thecommand"if[["$TRAVIS_OS_NAME"=="osx"]];thenbrewinstallpython3;fi"failedandexitedwith1during.Yourbuildhasbeenstop

随机推荐