大厅CI:利用docker图像caching

我完全明白,Concourse是无意义的,但是还有什么办法可以重新使用已经被拖拽的docker图片吗? 在我的情况下,我build立了~10个具有相同基本图像的docker图像,但是每次构build被触发时,Concourse将基本图像拉10次。

是否有可能拉一次图像,并在以后使用标准的docker资源重新使用它(至less在同一个版本的范围内)?

是的,应该可以做到这一点使用自定义图像和脚本代码,但我不喜欢邀请自行车。

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

--cache-from没有帮助,因为CI花费大部分时间拉图像,而不是build立新的图层。

理论

首先,一些广播理论(至less在3.3.1版本):

人们经常谈论Concourse有一个“caching”,但曲解这意味着什么。 每个中央工作人员在磁盘上都有一组剩余的卷,形成一个卷caching。 此卷高速caching包含已由资源getput以及任务outputs填充的卷。

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

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


实践

现在select优化构build时间的选项:

load_base

背景

load_base docker-image-resource putload_base参数告诉资源构build通过put参数指定的图像之前 ,第一个load_base put一个图像(通过getdocker load到其本地docker服务器中。

当您需要将图像预先填充到“dockercaching”中时,这非常有用。 在你的情况下,你会想要预先加载在FROM指令中使用的图像。 这样做效率更高,因为它使用Concourse自己的卷caching来只拉一次“基”,使得在执行FROM命令期间它可用于docker服务器。

用法

你可以使用load_base如下:

假设你想构build一个自定义的python图像,并且你有一个文件ci/Dockerfile的git仓库,如下所示:

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

如果您希望自动创build/推送此映像,同时利用Concourse卷caching以及Docker映像层caching

 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 - put: python-image params: load_base: ubuntu dockerfile: repo/ci/Dockerfile 

cachecache_tag

背景

cache_tag docker-image-resource putcachecache_tag参数会告诉资源首先从远程源文件中提取特定的图像+标签, 然后构build通过put参数指定的图像。

这比较容易从头开始构build,比较容易,比如编译过程很 ,比如昂贵的编译

不会利用Concourse的容量caching,并且在每次put期间都会使用Docker的--cache-fromcaching--cache-fromfunction(需要首先执行docker pull的风险)。

用法

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

假设你想构build一个自定义的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 

如果您想自动构build/推送此映像,同时只利用Docker映像层caching

 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 

build议

如果你想提高build造docker图片的效率,我个人的看法是在大多数情况下应该使用load_base 。 因为它使用资源get ,所以它利用了Concourse卷caching,并且避免了需要额外的docker pull