使用 Buildah 創建小體積的容器

使用 Buildah 創建小體積的容器

編譯自: https://opensource.com/article/18/5/containers-buildah

譯者: Andy Song

技術問題推動了開源協作的力量。

時間如梭,去年我加入 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 的)最小化鏡像,僅僅將 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 想知道為何 Buildah 鏡像體積反而大 17MB,畢竟 python 和 yum 軟件包都沒有安裝到 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 軟件可以多麼快速和容易地創建體積最小化的容器,該容器僅包含你高效運行任務所需的軟件。額外的好處是,你無需運行一個守護進程。


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


分享到:


相關文章: