在另一家科技公司工作多年后,我最近加入了红帽。在之前的工作中,我开发了许多不同的软件产品,这些产品很成功,但都是专有的。我们不仅在法律上被强制要求不与公司外部共享软件,而且通常甚至在公司内部也不共享。当时,这对我来说完全有道理:公司花费了时间、精力和预算来开发软件,因此他们应该保护并获得由此带来的回报。
快进到一年前,当我加入红帽并形成了完全不同的思维模式。我最先投入的项目之一是 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)镜像,仅将 coreutils
和 bash
软件包添加到镜像中,并使用了以下脚本
$ 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,因为 python
和 yum
没有安装在 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。 经许可转载。
评论已关闭。