使用 Buildah 創建小體積的容器
來自專欄 Linux 開源評論
技術問題推動了開源協作的力量。
我最近加入了 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 imagesREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/centos 7 2d194b392dd1 2 weeks ago 195 MB
他發現 Docker 鏡像的體積為 195MB。Tim 接著使用 Buildah 創建了一個(基於 scratch 的)最小化鏡像,僅僅將 coreutils
和 bash
軟體包加入到鏡像中,使用的腳本如下:
$ cat ./buildah-base.sh#!/bin/bashset -x# build a minimal imagenewcontainer=$(buildah from scratch)scratchmnt=$(buildah mount $newcontainer)# install the packagesyum install --installroot $scratchmnt bash coreutils --releasever 7 --setopt install_weak_deps=false -yyum clean all -y --installroot $scratchmnt --releasever 7sudo buildah config --cmd /bin/bash $newcontainer# set some config infobuildah config --label name=centos-base $newcontainer# commit the imagebuildah unmount $newcontainerbuildah commit $newcontainer centos-base$ sudo ./buildah-base.sh$ sudo buildah imagesIMAGE ID IMAGE NAME CREATED AT SIZE8379315d3e3e docker.io/library/centos-base:latest Mar 25, 2018 17:08 212.1 MB
Tim 想知道為何 Buildah 鏡像體積反而大 17MB,畢竟 python
和 yum
軟體包都沒有安裝到 Buildah 鏡像中,而這些軟體已經安裝到 Docker 鏡像中。這個結果並不符合預期,在 Github 的相關主題中引發了廣泛的討論。
不僅 Red Hat 的員工參與了討論,還有不少公司外人士也加入了討論,這很有意義。值得一提的是,GitHub 用戶 @pixdrift 主導了很多重要的討論並提出很多發現,他指出在這個 Buildah 鏡像中文檔和語言包就佔據了比 100MB 略多一點的空間。Pixdrift 建議在 yum 安裝器中強制指定語言,據此提出如下修改過的 buildah-bash.sh
腳本:
#!/bin/bashset -x# build a minimal imagenewcontainer=$(buildah from scratch)scratchmnt=$(buildah mount $newcontainer)# install the packagesyum install --installroot $scratchmnt bash coreutils --releasever 7 --setopt=install_weak_deps=false --setopt=tsflags=nodocs --setopt=override_install_langs=en_US.utf8 -yyum clean all -y --installroot $scratchmnt --releasever 7sudo buildah config --cmd /bin/bash $newcontainer# set some config infobuildah config --label name=centos-base $newcontainer# commit the imagebuildah unmount $newcontainerbuildah 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中國 榮譽推出
推薦閱讀:
※關於容器眾說紛紜,你真的需要聽聽老王的
※Docker使用OpenStack Cinder持久化volume原理分析及實踐
※idea docker 配置
※docker在web開發中得使用流程是怎樣的?
※關於/var/run/docker.sock