MENU

Buildah — Dockerfile不要でOCIイメージを組み立てるビルダー

Buildah アイキャッチ
Buildah

Buildah(ブッダ)は、コンテナイメージをスクリプトから細粒度に組み立てるためのOCI準拠ビルダーです。2017年にRed Hatのダニエル・ウォルシュ、ネイサン・スコウクロフトらが立ち上げ、同年6月にバージョン0.1がリリースされ、2018年5月にBuildah 1.0として安定版に到達しました。DockerfileのRUN・COPYといった命令と等価な操作を、buildah frombuildah runbuildah copyといったコマンドで実行できる点が特徴で、Dockerデーモン無しに、しかもrootlessでイメージを構築できます。Podman・Skopeo・CRI-Oと並ぶRed Hatコンテナツール群の中心に位置します。

目次

この記事の目次

  1. デーモンレス・rootless・スクリプト指向
  2. Red Hatコンテナ群の中での出自
  3. CIパイプラインでの典型操作
  4. docker buildとの比較
  5. まとめ

デーモンレス・rootless・スクリプト指向

デーモンレス・rootless・スクリプト指向

Buildahのアーキテクチャは「常駐デーモンを置かず、コマンド単位でビルドステップを構築する」点で従来のDocker buildと一線を画します。Docker buildはdockerdデーモンに依頼してDockerfile全体を一括処理しますが、Buildahは各ステップをCLIコマンドとして呼び出し、シェルスクリプトの中で条件分岐やループを組み合わせながらイメージレイヤーを積み上げられます。これにより、Dockerfileでは表現が難しい複雑なビルドロジック(例: 環境変数に応じたパッケージ追加、対話的処理を含むセットアップ)を素直に書けるようになります。

セキュリティ面ではrootlessビルドを第一級でサポートする点が重要です。CI環境やマルチテナントなKubernetesクラスタでは、root権限でDockerデーモンを動かすことに強い制約がかかる場合があり、Buildahはユーザー名前空間を使った一般権限ビルドで、その制約を回避します。出力されるイメージはOCI Image Specに準拠し、Dockerレジストリ・Quay・Harborなどにbuildah pushでそのまま転送できます。

Red Hatコンテナ群の中での出自

Red Hatコンテナ群の中での出自

Buildahは2017年初頭にRed Hatのコンテナチームがダニエル・ウォルシュを中心に設計を始めました。同社は当時、Dockerデーモンへの依存を避けたコンテナエコシステムをすでに構築しつつあり、CRI-O(コンテナ実行)、Skopeo(イメージ操作)の次に必要なピースとして、ビルドツールが計画されました。2017年6月にBuildah 0.1がリリースされ、2018年5月にBuildah 1.0として安定版に達しました。プロジェクト名「Buildah」は、Builder(ビルダー)の口語表現にあやかったものとされています。

OpenShift Container Platform 4の登場(2019年)以降、BuildahはOpenShiftの「Source-to-Image」や「Buildah Build」ワークフローの内部エンジンとして組み込まれました。GitLab Runner、Tekton Pipelines、KubernetesのKaniko代替などCI/CD分野でも採用が広がり、現在ではDockerfileの代替というよりも、「Dockerfileを直接ビルドしつつ、必要ならスクリプト的に拡張できる便利ツール」として認知されています。buildah budコマンドはDockerfileを読み込んでイメージを生成する役割を持ち、Dockerと同じDockerfile資産を活用しながら、Buildahの柔軟さを享受できます。

CIパイプラインでの典型操作

CIパイプラインでの典型操作

Buildahの典型的なワークフローは、コンテナを起点に少しずつイメージを育てる流れです。まずbuildah from registry.redhat.io/ubi9でRed Hat UBI 9のベースを取り出し、戻り値として「ワーキングコンテナ」のIDを得ます。そのIDに対してbuildah run dnf install -y nginxのようにコマンドを実行し、buildah copy ./html /usr/share/nginx/htmlでファイルを取り込み、最後にbuildah commit myapp:latestでイメージとして確定します。

CI環境では、これらのコマンドをシェルスクリプトかMakefileに記述し、必要に応じてbuildah pullbuildah inspectを挟みながら制御します。最終的にbuildah push myapp:latest docker://quay.io/example/myapp:latestでレジストリに送信できます。Kubernetes上で動くCIジョブからもrootless実行可能なため、特権コンテナを要求せずにイメージビルドを完結できる点が大きなメリットです。Tekton Pipelinesの公式タスク集には、buildahタスクが標準で含まれており、OpenShift Pipelinesの定番ビルド手段となっています。

docker buildとの比較

docker buildとの比較

docker buildとBuildahの最大の違いは、デーモン依存の有無とビルド単位の粒度です。docker buildはDockerfileに記述された命令列をdockerdが一括で実行するモデルで、BuildKit(2019年以降の既定)によりキャッシュやマルチステージビルドが高度に最適化されています。一方Buildahは各ステップが独立したコマンドで、シェルスクリプトの構造をそのままビルドロジックに活かせる柔軟性を持ちます。Dockerfile互換性も保たれており、buildah bud Dockerfileで従来のDockerfile資産も流用できます。

適材適所の使い分けが現実的です。個人開発や標準的なDockerfileで完結するケースではdocker buildやpodman buildで十分ですが、「マルチテナントKubernetes上でroot権限を与えずにイメージを作りたい」「Dockerfileでは表現が複雑になりすぎるロジックを書きたい」といった要件ではBuildahが強みを発揮します。OpenShiftのSource-to-Imageや、Tektonのビルドタスクの裏側で広く使われていることが、その立ち位置を物語っています。

まとめ

Buildahは2017年にRed Hatが立ち上げた、デーモンレス・rootlessでOCIイメージを構築するビルダーです。Dockerfile互換性を持ちつつ、コマンド単位でビルドステップを細かく制御できる柔軟性が特徴です。Podman・Skopeo・CRI-Oと組み合わせてDocker無しのコンテナ運用を可能にし、OpenShiftやTektonの内部エンジンとしても活躍しています。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次