Linux中國

使用 Buildah 創建小體積的容器

我最近加入了 Red Hat,在這之前我在另外一家科技公司工作了很多年。在我的上一份工作崗位上,我開發了不少不同類型的軟體產品,這些產品是成功的,但都有版權保護。不僅法規限制了我們不能在公司外將軟體共享,而且我們在公司內部也基本不進行共享。在那時,我覺得這很有道理:公司花費了時間、精力和預算用於開發軟體,理應保護並要求軟體涉及的利益。

時間如梭,去年我加入 Red Hat 並培養出一種完全不同的理念。Buildah 項目是我最早加入的項目之一,該項目用於構建 OCI (Open Container Initiative) 標準的鏡像,特別擅長讓你精簡創建好的鏡像的體積。那時 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 想知道為何 Buildah 鏡像體積反而大 17MB,畢竟 pythonyum 軟體包都沒有安裝到 Buildah 鏡像中,而這些軟體已經安裝到 Docker 鏡像中。這個結果並不符合預期,在 Github 的相關主題中引發了廣泛的討論。

不僅 Red Hat 的員工參與了討論,還有不少公司外人士也加入了討論,這很有意義。值得一提的是,GitHub 用戶 @pixdrift 主導了很多重要的討論並提出很多發現,他指出在這個 Buildah 鏡像中文檔和語言包就佔據了比 100MB 略多一點的空間。Pixdrift 建議在 yum 安裝器中強制指定語言,據此提出如下修改過的 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% 的體積縮減不能讓他們滿足。討論繼續深入下去,涉及如何移除個人語言包以節省更多空間。如果想了解討論細節,點擊 Buildah 鏡像體積並不小? 這個鏈接。說不定你也能給出有幫助的點子,甚至更進一步成為 Buildah 項目的貢獻者。這個主題的解決從一個側面告訴我們,Buildah 軟體可以多麼快速和容易地創建體積最小化的容器,該容器僅包含你高效運行任務所需的軟體。額外的好處是,你無需運行一個守護進程。

這個鏡像體積縮減的主題讓我意識到開源軟體的力量。來自不同公司的大量開發者,在一天多的時間內,以開放討論的形式進行合作解決問題。雖然解決這個具體問題並沒有修改已有代碼,但 Red Hat 公司外開發者對 Buildah 做了很多代碼貢獻,進而幫助項目變得更好。這些貢獻也吸引了更多人才關注項目代碼;如果像之前那樣,代碼作為版權保護軟體的一部分放置在私有 git 倉庫中,不會獲得上述好處。我只用了一年的時間就轉向擁抱 開源方式,而且可能不會再轉回去了。

文章最初發表於 Project Atomic,已獲得轉載許可。

via: https://opensource.com/article/18/5/containers-buildah

作者:Tom Sweeney 選題:lujun9972 譯者:pinewall 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國