17.4 Buildah - 容器映象建立工具
版本說明:Buildah 與 Podman 和 Skopeo 共同維護。建議查閱 Buildah 官方文件 和 GitHub Releases 瞭解最新版本。
本節介紹 Buildah,包括其基礎概念、應用場景以及基本指令。
17.4.1 Buildah 簡介
Buildah 是一個用於建立 OCI(Open Container Initiative)相容格式容器映象的開源指令行工具。與 Docker 需要一直執行的守護程序(daemon)不同,Buildah 的設計初衷是無需守護程序(daemonless)即可工作,並且也不強制要求 root 許可權(rootless)。這使得在持續整合/持續部署(CI/CD)環境中建立映象時能夠更加輕量且安全。
Buildah 由 Red Hat 主導開發,通常和 Podman、Skopeo 一起使用,被認為是建立、執行和管理容器的一套現代化工具鏈。在很多需要增強安全性和無需依賴守護程序的場景中,Buildah 是 docker build 指令的最佳替代方案。
17.4.2 核心屬性
- 無守護程序(Daemonless):Buildah 直接透過系統呼叫拉取、建立和推送映象,減少了單點故障的風險和資源開銷。
- 建立效率高:可以掛載映象的根檔案系統到本地,並直接利用宿主機的工具對其進行操作,非常靈活。
- 相容性:不僅支援處理傳統的 Dockerfile,還能完全相容 OCI(Open Container Initiative)標準和 Docker 格式。
- 與 Podman 整合:Podman 自身建立映象的指令
podman build底層實際上也是依賴 Buildah 函式庫來實現的。
17.4.3 安裝 Buildah
在許多主流的 Linux 發行版中都可以透過套件管理器直接安裝 Buildah。
以 Fedora/CentOS/RHEL 為例:
$ sudo dnf install -y buildah
以 Ubuntu/Debian 為例(需引入官方源後):
$ sudo apt-get update
$ sudo apt-get -y install buildah
17.4.4 基礎用法範例
1. 從現有的 Dockerfile 建立映象
Buildah 最常見的用法就是像 Docker 一樣根據 Dockerfile 來建立映象,可以直接使用 buildah bud(或者 buildah build-using-dockerfile)指令:
$ buildah bud -t my-app:latest .
可以看到在這點上,它與 docker build 的體驗完全一致。
2. 互動式從空映象開始建立
除了使用 Dockerfile,Buildah 最強大的功能來自於它的互動式和指令碼化建立機制。我們可以從一個極簡的映象(或基礎映象)開始建立:
# 獲取一個基礎映象
$ container=$(buildah from alpine:latest)
# 獲取掛載點,並檢視其路徑
$ mnt=$(buildah mount $container)
$ echo $mnt
/var/lib/containers/storage/overlay/xxx/merged
# 利用宿主機直接建立檔案,而不需要在容器內部執行指令
$ echo "Hello Buildah" > $mnt/hello.txt
# 新增一些設定和指令
$ buildah config --cmd "cat /hello.txt" $container
# 將容器送出為映象
$ buildah commit $container my-hello-image:latest
# 建立完成後可以解除安裝並清理容器上下文
$ buildah unmount $container
$ buildah rm $container
這種模式在自動化流水線中極為有用,因為我們可以將上述過程編寫成標準的 bash 指令碼,無需為了建立映象而撰寫只在其獨立語法中執行的 Dockerfile 指令。
3. 檢視和推送映象
透過 buildah images 可以檢視當前環境中的映象。推送映象到外部 Registry 也十分安全方便:
# 檢視本地建立的映象
$ buildah images
# 推送映象到 Docker Hub(注意需要先登入)
$ buildah push my-hello-image:latest docker://docker.io/username/my-hello-image:latest
結合其無需特權和靈活指令碼的優點,Buildah 正變得越來越受到建立和分發 OCI 映象的使用者喜愛。