使用 Buildah 创建小型容器

一个技术问题突显了开源协作的力量。
301 位读者喜欢这篇文章。

在另一家科技公司工作多年后,我最近加入了红帽。在之前的工作中,我开发了许多不同的软件产品,这些产品很成功,但都是专有的。我们不仅在法律上被强制要求不与公司外部共享软件,而且通常甚至在公司内部也不共享。当时,这对我来说完全有道理:公司花费了时间、精力和预算来开发软件,因此他们应该保护并获得由此带来的回报。

快进到一年前,当我加入红帽并形成了完全不同的思维模式。我最先投入的项目之一是 Buildah 项目。它有助于构建开放容器倡议 (OCI) 镜像,尤其擅长让您定制所创建镜像的大小。当时,Buildah 还处于非常早期的阶段,这里那里有一些瑕疵,尚未完全为生产环境做好准备。

作为项目新手,我做了一些小的改动,然后询问公司的内部 git 仓库在哪里,以便我可以推送我的更改。答案是:没有内部仓库,只需将您的更改推送到 GitHub。我感到困惑——将我的更改发送到 GitHub 意味着任何人都可以查看该代码并将其用于他们自己的项目。此外,代码仍然有一些瑕疵,这似乎非常违反直觉。但作为新人,我还是带着疑惑摇了摇头,并将更改推送了出去。

一年后,我现在确信开源软件的力量和价值。我仍在从事 Buildah 的工作,最近我们遇到了一个问题,它说明了这种力量和价值。该问题标题为 Buildah 镜像不够小?,由 Tim Dudgeon (@tdudgeon) 提出。 概括来说,他注意到由 Buildah 创建的镜像比由 Docker 创建的镜像更大,即使 Buildah 镜像不包含他在 Docker 镜像中看到的额外“冗余内容”。

为了比较,他首先执行了

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

他注意到 Docker 镜像的大小为 195MB。 然后,Tim 使用 Buildah 创建了一个最小的(scratch)镜像,仅将 coreutilsbash 软件包添加到镜像中,并使用了以下脚本

$ cat  ./buildah-base.sh
#!/bin/bash

set -x

# build a minimal image
newcontainer=$(buildah from scratch)
scratchmnt=$(buildah mount $newcontainer)

# install the packages
yum install --installroot $scratchmnt bash coreutils --releasever 7 --setopt install_weak_deps=false -y
yum clean all -y --installroot $scratchmnt --releasever 7

sudo buildah config --cmd /bin/bash $newcontainer

# set some config info
buildah config --label name=centos-base $newcontainer

# commit the image
buildah unmount $newcontainer
buildah commit $newcontainer centos-base

$ sudo ./buildah-base.sh

$ sudo buildah images
IMAGE ID               IMAGE NAME                                             CREATED AT            SIZE
8379315d3e3e     docker.io/library/centos-base:latest           Mar 25, 2018 17:08   212.1 MB

Tim 想知道为什么镜像大了 17MB,因为 pythonyum 没有安装在 Buildah 镜像中,而它们却安装在 Docker 镜像中。 这在 GitHub 问题中引发了相当多的讨论,因为这完全不是预期的结果。

讨论的精彩之处在于,不仅有红帽的人参与其中,还有一些来自外部的人也参与了。 特别是,GitHub 用户 @pixdrift 主导了大量的精彩讨论和调查,他指出文档和 locale-archive 占用了 Buildah 镜像中略多于 100MB 的空间。 Pixdrift 建议在 yum 安装程序中强制使用 locale,并提供了更新后的 buildah-bash.sh 脚本以及这些更改

#!/bin/bash

set -x

# build a minimal image
newcontainer=$(buildah from scratch)
scratchmnt=$(buildah mount $newcontainer)

# install the packages
yum install --installroot $scratchmnt bash coreutils --releasever 7 --setopt=install_weak_deps=false --setopt=tsflags=nodocs --setopt=override_install_langs=en_US.utf8 -y
yum clean all -y --installroot $scratchmnt --releasever 7

sudo buildah config --cmd /bin/bash $newcontainer

# set some config info
buildah config --label name=centos-base $newcontainer

# commit the image
buildah unmount $newcontainer
buildah commit $newcontainer centos-base

当 Tim 运行这个新脚本时,镜像大小缩小到 92MB,从原始 Buildah 镜像大小中减少了 120MB,并且更接近预期的大小;然而,工程师毕竟是工程师,节省 56% 的大小还不够。 讨论进一步深入,涉及如何删除单个 locale 软件包以节省更多空间。 要查看更详细的讨论,请单击 Buildah 镜像不够小? 链接。 谁知道呢——也许您会有有用的提示,或者更好的是,成为 Buildah 的贡献者。 顺便提一下,这个解决方案说明了如何使用 Buildah 软件快速轻松地创建一个最小尺寸的容器,该容器仅加载您高效完成工作所需的软件。 额外的好处是,它不需要守护进程运行。

这个镜像大小问题让我深刻体会到开源软件的力量。 来自不同公司的许多人通过公开讨论,在一天多一点的时间内合作解决了一个问题。 尽管没有创建任何代码更改来解决这个特定问题,但来自红帽外部的贡献者为 Buildah 贡献了许多代码,这有助于使项目变得更好。 这些贡献使更多不同领域的才华横溢的人能够查看代码,如果它是一个专有的软件,被困在私有 git 仓库中,这是永远无法实现的。 我只用了一年时间就转变为 开源之道,而且我认为我再也回不去了。

本文最初发布于 Project Atomic。 经许可转载。

标签
User profile image.
红帽公司的软件工程师,从事容器相关工作。 丈夫和 3 个孩子的父亲,只是想管住他们!

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.