首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Concourse :利用码头图像缓存

Concourse :利用码头图像缓存
EN

Stack Overflow用户
提问于 2017-06-10 15:41:57
回答 1查看 9.2K关注 0票数 27

我完全理解Concourse的意思是无国籍的,但是有什么方法可以重复使用已经拉过的码头图像吗?在我的例子中,我构建了10个基本图像相同的对接者图像,但每次构建都被触发,Concourse将基本图像拉出10次。

是否有可能一次提取该映像,然后使用标准码头资源(至少在同一构建的范围内)重用它?

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

如果标准码头资源不允许这样做,是否有可能以某种方式扩展它以支持这种行为?

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

EN

回答 1

Stack Overflow用户

发布于 2017-07-06 21:30:02

理论

首先,一些汇合理论(至少在第3.3.1版):

人们经常谈论Concourse有一个“缓存”,但误解了这意味着什么。每个汇编器在磁盘上都有一组卷,这些卷被留在磁盘上,形成卷缓存。此卷缓存包含由资源getput以及任务outputs填充的卷。

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

这意味着,当我们讨论使用坞映像资源进行缓存时,它意味着将图像加载或预拖到本地停靠服务器。

实践

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

load_base

背景

load_base param在您的docker-image-resource put中告诉资源,在构建通过put参数指定的映像之前,首先将图像(通过get检索到)到其本地停靠服务器。

当您需要将图像预填充到“坞缓存”中时,这是非常有用的。在您的示例中,您可能希望预加载FROM指令中使用的图像。这样做的效率更高,因为它使用Concourse自己的卷缓存只拉动"base“一次,使其在执行FROM命令时可供停靠服务器使用。

用法

您可以按以下方式使用load_base

假设您想要构建一个定制的python映像,并且您有一个git存储库,其中有一个文件ci/Dockerfile,如下所示:

代码语言:javascript
复制
FROM ubuntu

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

如果您想在利用上下文卷缓存以及Docker映像层缓存的同时自动生成/推送此映像

代码语言:javascript
复制
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

背景

cachecache_tag参数在docker-image-resource put中告诉资源,在构建通过put参数指定的映像之前,首先从远程源中提取特定的image+tag。

当从零开始构建映像比从零构建映像更容易时,这是非常有用的,例如,您有一个非常长的构建过程,例如昂贵的编译

不使用Concourse的卷缓存,并且在每个put期间都使用Docker的--cache-from特性(这可能需要首先执行docker pull)。

用法

您可以使用cachecache_tag,如下所示:

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

代码语言:javascript
复制
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

如果您想在仅利用码头映像层缓存的同时自动生成/推送此映像

代码语言:javascript
复制
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

推荐

如果你想提高构建码头形象的效率,我个人的看法是,在大多数情况下,应该使用load_base。因为它使用了一个资源get,所以它利用了Content卷缓存的优点,并且避免了需要执行额外的docker pull

票数 53
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44475165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档