Dock Stay
スクリプトでイメージを組み立てる - buildah の使い方・オプション・サンプル

スクリプトでイメージを組み立てる - buildah

Dockerfile を書かずにシェルスクリプトでイメージを組み立てられるビルドツール。OCI 準拠のイメージを daemonless で生成する。

概念図

buildah diagram

構文

bash
buildah from IMAGE
buildah run CONTAINER -- COMMAND
buildah commit CONTAINER NEW_IMAGE

実例

Alpine ベースの作業コンテナを作成する

bash
buildah from docker.io/library/alpine:3.19

作業コンテナ内でパッケージを追加する

bash
buildah run alpine-working-container -- apk add --no-cache curl

作業コンテナを新しいイメージとして保存する

bash
buildah commit alpine-working-container my-alpine:curl

Buildah の立ち位置

Buildah は Red Hat 系エコシステムで Podman と並ぶ位置にあるイメージビルド専用ツールです。

Podman が podman build でも Dockerfile ビルドを実行できるのに対し、Buildah はより低レベルに「作業中のコンテナに対して任意のコマンドを実行し、結果を commit する」という粒度での操作を提供します。

生成されるイメージは OCI 仕様準拠で、Docker Hub などのレジストリに push すれば他のランタイム(Docker, containerd, CRI-O)でも同じように利用できます。

daemonless なので CI 環境で余計なサービスを起動する必要がない点もメリットです。

buildah from / buildah run / buildah commit

Buildah の基本サイクルは 3 つのコマンドで表現できます。

buildah from でベースイメージから作業用のコンテナを作成し、buildah run でその中に任意のコマンドを実行し、buildah commit で最終的に新しいイメージとして保存します。

ファイルコピーは buildah copy、環境変数は buildah config --env KEY=VAL、エントリポイントは buildah config --entrypoint で設定します。

Dockerfile のディレクティブと 1 対 1 に対応しているので、既存の知識をそのまま使えます。

シェルスクリプトに書き出せるため、ループや条件分岐で動的にビルドを組み立てられる点が特徴です。

bash
ctr=$(buildah from docker.io/library/alpine:3.19)
buildah run $ctr -- apk add --no-cache nginx
buildah copy $ctr ./nginx.conf /etc/nginx/nginx.conf
buildah config --entrypoint '["nginx", "-g", "daemon off;"]' $ctr
buildah commit $ctr my-nginx:1.0

Dockerfile ビルドとの違い

Dockerfile ビルドと Buildah スクリプトは、同じ OCI イメージを作る手段でもアプローチが大きく異なります。

観点 Dockerfile Buildah スクリプト
記法 宣言的(各行が 1 レイヤ) シェルスクリプト(任意の制御構文)
動的な分岐・ループ 別言語でテンプレート化が必要 if / for を直接記述
キャッシュと再現性 レイヤ単位で管理しやすい commit 単位を自分で設計する
外部データ参照 ARGCOPY 経由で間接的 スクリプト中から直接取得
既存 Dockerfile そのままビルド buildah bud(build-using-dockerfile)で流用可

「Dockerfile を書くほどでもない単発のイメージ作成」「複数のイメージバリエーションを 1 スクリプトで生成したい」といった用途で Buildah のスクリプト的アプローチが活きます。

関連トピック