我完全理解Concourse的意思是无国籍的,但是有什么方法可以重复使用已经拉过的码头图像吗?在我的例子中,我构建了10个基本图像相同的对接者图像,但每次构建都被触发,Concourse将基本图像拉出10次。
是否有可能一次提取该映像,然后使用标准码头资源(至少在同一构建的范围内)重用它?
是的,应该可以使用自定义图像并在sh脚本中编码,但我不喜欢邀请自行车。
如果标准码头资源不允许这样做,是否有可能以某种方式扩展它以支持这种行为?
--cache-from是没有帮助的,因为CI花费了大部分时间来提取图像,而不是构建新的层。
发布于 2017-07-06 21:30:02
理论
首先,一些汇合理论(至少在第3.3.1版):
人们经常谈论Concourse有一个“缓存”,但误解了这意味着什么。每个汇编器在磁盘上都有一组卷,这些卷被留在磁盘上,形成卷缓存。此卷缓存包含由资源get和put以及任务outputs填充的卷。
人们也常常误解docker-image-resource是如何使用Docker的。在您的Concourse安装中,没有运行全局停靠服务器,实际上,containers容器不是docker容器,它们是runC容器。每个docker-image-resource进程(check、get、put)都在自己的runC容器中运行,其中有一个本地码头服务器正在运行。这意味着没有全局停靠服务器来提取对接者图像并缓存这些层以供进一步使用。
这意味着,当我们讨论使用坞映像资源进行缓存时,它意味着将图像加载或预拖到本地停靠服务器。
实践
现在来看优化构建时间的选项:
load_base
背景
load_base param在您的docker-image-resource put中告诉资源,在构建通过put参数指定的映像之前,首先将图像(通过get检索到)到其本地停靠服务器。
当您需要将图像预填充到“坞缓存”中时,这是非常有用的。在您的示例中,您可能希望预加载FROM指令中使用的图像。这样做的效率更高,因为它使用Concourse自己的卷缓存只拉动"base“一次,使其在执行FROM命令时可供停靠服务器使用。
用法
您可以按以下方式使用load_base:
假设您想要构建一个定制的python映像,并且您有一个git存储库,其中有一个文件ci/Dockerfile,如下所示:
FROM ubuntu
RUN apt-get update
RUN apt-get install -y python python-pip如果您想在利用上下文卷缓存以及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/Dockerfilecache & cache_tag
背景
cache和cache_tag参数在docker-image-resource put中告诉资源,在构建通过put参数指定的映像之前,首先从远程源中提取特定的image+tag。
当从零开始构建映像比从零构建映像更容易时,这是非常有用的,例如,您有一个非常长的构建过程,例如昂贵的编译
此不使用Concourse的卷缓存,并且在每个put期间都使用Docker的--cache-from特性(这可能需要首先执行docker pull)。
用法
您可以使用cache和cache_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如果您想在仅利用码头映像层缓存的同时自动生成/推送此映像
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。
https://stackoverflow.com/questions/44475165
复制相似问题