使用 Buildah 创建小体积的容器

我最近加入了 Red Hat,在这之前我在另外一家科技公司工作了很多年。在我的上一份工作岗位上,我开发了不少不同类型的软件产品,这些产品是成功的,但都有版权保护。不仅法规限制了我们不能在公司外将软件共享,而且我们在公司内部也基本不进行共享。在那时,我觉得这很有道理:公司花费了时间、精力和预算用于开发软件,理应保护并要求软件涉及的利益。

时间如梭,去年我加入 Red Hat 并培养出一种完全不同的理念。Buildah 项目是我最早加入的项目之一,该项目用于构建 OCI (Open Container Initiative) 标准的镜像,特别擅长让你精简创建好的镜像的体积。那时 Buildah 还处于非常早期的阶段,包含一些瑕疵,不适合用于生产环境。

刚接触项目不久,我做了一些小变更,然后询问公司内部 git 仓库地址,以便提交我做的变更。收到的回答是:没有内部仓库,直接将变更提交到 GitHub 上。这让我感到困惑,将我的变更提交到 GitHub 意味着:任何人都可以查看这部分代码并在他们自己的项目中使用。况且代码还有一些瑕疵,这样做简直有悖常理。但作为一个新人,我只是惊讶地摇了摇头并提交了变更。

一年后,我终于相信了开源软件的力量和价值。我仍为 Buildah 项目工作,我们最近遇到的一个主题很形象地说明了这种力量和价值。这个标题为 Buildah 镜像体积并不小? 的工单由 Tim Dudgeon (@tdudgeon) 提出。简而言之,他发现使用 Buildah 创建的镜像比使用 Docker 创建的镜像体积更大,而且 Buildah 镜像中并不包含一些额外应用,但 Docker 镜像中却包含它们。

为了比较,他首先操作如下:

 
  
  1. $ docker pull centos:7
  2. $ docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. docker.io/centos 7 2d194b392dd1 2 weeks ago 195 MB

他发现 Docker 镜像的体积为 195MB。Tim 接着使用 Buildah 创建了一个(基于 scratch 的)最小化镜像,仅仅将 coreutils 和 bash 软件包加入到镜像中,使用的脚本如下:

 
  
  1. cat ./buildah-base.sh
  2. #!/bin/bash
  3. set -x
  4. # build a minimal image
  5. newcontainer=$(buildah from scratch)
  6. scratchmnt=$(buildah mount $newcontainer)
  7. # install the packages
  8. yum install --installroot $scratchmnt bash coreutils --releasever 7 --setopt install_weak_deps=false -y
  9. yum clean all ---installroot $scratchmnt --releasever 7
  10. sudo buildah config --cmd /bin/bash $newcontainer
  11. # set some config info
  12. buildah config --label name=centos-base $newcontainer
  13. # commit the image
  14. buildah unmount $newcontainer
  15. buildah commit $newcontainer centos-base
  16. sudo ./buildah-base.sh
  17. sudo buildah images
  18. IMAGE ID IMAGE NAME CREATED AT SIZE
  19. 8379315d3e3e docker.io/library/centos-base:latest Mar 25, 2018 17:08 212.1 MB

Tim 想知道为何 Buildah 镜像体积反而大 17MB,毕竟 python 和 yum 软件包都没有安装到 Buildah 镜像中,而这些软件已经安装到 Docker 镜像中。这个结果并不符合预期,在 Github 的相关主题中引发了广泛的讨论。

原文链接

你可能感兴趣的:(使用 Buildah 创建小体积的容器)