我完全理解Concourse是无国籍的,但是有没有办法重新使用已拉动的docker图像? 在我的例子中,我构建了~10个具有相同基本图像的docker图像,但每次构建都被触发Concourse将基本图像拉10次。
是否可以使用标准泊坞窗资源将该图像拉一次并在以后重新使用(至少在同一版本的范围内)?
是的,应该可以使用自定义图像并在sh脚本中编写它,但我不喜欢邀请自行车。
如果标准的docker资源不允许,是否可以以某种方式扩展它以启用此类行为?
--cache-from
没有帮助,因为CI花费大部分时间来提取图片,而不是构建新图层。
答案 0 :(得分:24)
首先,一些大厅理论(至少从v3.3.1开始):
人们经常谈论Concourse有“缓存”,但误解了这意味着什么。每个广播工作者在磁盘上都有一组卷,这些卷留在周围,形成卷缓存。此卷缓存包含已由资源get
和put
以及任务outputs
填充的卷。
人们也经常误解docker-image-resource
如何使用Docker。没有全局docker服务器与Concourse安装一起运行,实际上Concourse容器不是Docker容器,它们是runC容器。每个docker-image-resource
进程(check
,get
,put
)都在其自己的runC容器内运行,其中运行本地docker服务器。这意味着没有全局docker服务器正在拉动docker镜像并缓存这些层以供进一步使用。
这意味着当我们讨论使用docker-image-resource进行缓存时,意味着将图像加载或预先拉到本地docker服务器。
现在可以选择优化构建时间:
load_base
load_base
docker-image-resource
中的put
参数告诉资源首先docker load
将图像(通过get
检索到)到其本地泊坞服务器, 之前构建通过put
参数指定的图像。
当您需要将图像预先填充到“docker cache”中时,这非常有用。在您的情况下,您需要预加载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
cache
cache_tag
中的docker-image-resource
和put
参数告诉资源首先从远程来源提取特定图片+代码,之前构建通过put params指定的图像。
当下拉图像比从头开始构建图像更容易时,这很有用,例如:你有一个非常长的构建过程,比如昂贵的编译
不会利用Concourse的卷缓存,并在每--cache-from
期间利用Docker的docker pull
功能(需要首先执行put
的风险) }。
您可以按如下方式使用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
如果您希望在利用 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
如果你想提高建造码头图像的效率,我个人认为在大多数情况下应该使用load_base
。因为它使用资源get
,所以它利用了Concourse卷缓存,并且避免了需要额外的docker pull
。