理论
首先,一些 Concourse 理论(至少从 v3.3.1 开始):
人们经常谈论 Concourse 有一个“缓存”,但误解了它的含义。每个大厅工作人员在磁盘上都有一组卷,这些卷留在周围,形成一个卷缓存。此卷缓存包含已由资源 get 和 put 以及任务 outputs 填充的卷。
人们也经常误解docker-image-resource 是如何使用 Docker 的。您的 Concourse 安装没有运行全局 docker 服务器,实际上 Concourse 容器不是 Docker 容器,它们是 runC 容器。每个docker-image-resource 进程(check、get、put)都在自己的 runC 容器内运行,其中运行着一个本地 docker 服务器。这意味着没有全局 docker 服务器正在拉取 docker 图像并缓存层以供进一步使用。
这意味着当我们谈论使用 docker-image-resource 进行缓存时,它意味着将图像加载或预拉到本地 docker 服务器中。
练习
现在是优化构建时间的选项:
load_base
背景
load_base 中的 load_base 参数告诉资源首先将 docker load 图像(通过 get 检索)到其本地 docker 服务器,在构建之前通过您的 put 参数指定的图像。
当您需要将图像预填充到“docker 缓存”中时,这很有用。在您的情况下,您可能希望预加载 FROM 指令中使用的图像。这更有效,因为它使用 Concourse 自己的卷缓存仅拉取“基础”一次,使其在执行 FROM 命令期间可供 docker 服务器使用。
用法
您可以按如下方式使用load_base:
假设你想构建一个自定义的 python 镜像,并且你有一个 git 存储库,其中包含一个文件 ci/Dockerfile,如下所示:
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-resourceput 中的 cache 和 cache_tag 参数告诉资源首先从远程源拉特定图像+标签,之前 构建通过你的 put 参数指定的图像。
当下拉图像比从头构建图像更容易时,这很有用,例如您的构建过程非常漫长,例如昂贵的编译
这不利用 Concourse 的卷缓存,并在每个 put 期间利用 Docker 的 --cache-from 功能(存在需要首先执行 docker pull 的风险)。
用法
您可以使用cache 和cache_tag,如下所示:
假设你想构建一个自定义的 ruby 镜像,从源代码编译 ruby,并且你有一个 git 存储库,其中包含一个文件 ci/Dockerfile,如下所示:
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。