スクリプトでイメージを組み立てる - buildah
Dockerfile を書かずにシェルスクリプトでイメージを組み立てられるビルドツール。OCI 準拠のイメージを daemonless で生成する。
概念図
構文
buildah from IMAGE
buildah run CONTAINER -- COMMAND
buildah commit CONTAINER NEW_IMAGE実例
Alpine ベースの作業コンテナを作成する
buildah from docker.io/library/alpine:3.19作業コンテナ内でパッケージを追加する
buildah run alpine-working-container -- apk add --no-cache curl作業コンテナを新しいイメージとして保存する
buildah commit alpine-working-container my-alpine:curlBuildah の立ち位置
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 に対応しているので、既存の知識をそのまま使えます。
シェルスクリプトに書き出せるため、ループや条件分岐で動的にビルドを組み立てられる点が特徴です。
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.0Dockerfile ビルドとの違い
Dockerfile ビルドと Buildah スクリプトは、同じ OCI イメージを作る手段でもアプローチが大きく異なります。
| 観点 | Dockerfile | Buildah スクリプト |
|---|---|---|
| 記法 | 宣言的(各行が 1 レイヤ) | シェルスクリプト(任意の制御構文) |
| 動的な分岐・ループ | 別言語でテンプレート化が必要 | if / for を直接記述 |
| キャッシュと再現性 | レイヤ単位で管理しやすい | commit 単位を自分で設計する |
| 外部データ参照 | ARG や COPY 経由で間接的 |
スクリプト中から直接取得 |
| 既存 Dockerfile | そのままビルド | buildah bud(build-using-dockerfile)で流用可 |
「Dockerfile を書くほどでもない単発のイメージ作成」「複数のイメージバリエーションを 1 スクリプトで生成したい」といった用途で Buildah のスクリプト的アプローチが活きます。
