7 Buildahを使用したイメージの構築

この章では、Podmanで使用するための新しいイメージの作成に、Buildahを使用する方法について説明します。

Buildahユーティリティは、機能的にはPodmanと同様に動作しますが、OCIに準拠したイメージの構築を容易にするためにPodmanからの独立性を維持しています。BuildahとPodmanの主な相違点は、runコマンドの処理方法です。Buildahの目的はイメージの構築であるため、runコマンドは、コンテナ・イメージの作成を自動化するために必要な設定を含む構成ファイルであるContainerfile内のRUN文と同等の動作をします。

この相違点によって、イメージの構築とPodmanで実行する本番レベルのコンテナ・インフラストラクチャの分離が容易になります。また、既存のContainerfile構築手順を簡単に処理できるようになります。

Buildahを使用して、既存のレジストリからイメージをプルし、それらを変更して、より特殊な機能を備えた新しいイメージを作成します。Buildahでは、イメージの作成のためにOracle Container Runtime for Dockerで動作する既存のContainerfileを使用できます。また、イメージを直接プルして、Buildah環境で実行するコンテナ内で変更することもできます。

PodmanとBuildahは同じローカル・イメージ・ストアを使用します。つまり、Buildahで構築したイメージからPodmanでコンテナを開始できます。また、Buildahを使用した新しいイメージの構築のために使用するベース・イメージとして、Podmanでローカルにプルしていたイメージを使用することもできます。ローカル・イメージは共有されますが、コンテナ自体はBuildahとPodmanで個別に実行されます。PodmanはBuildahで実行しているコンテナにアクセスできません。また、BuildahはPodmanで実行しているコンテナにアクセスできません。これは、Buildahで実行するコンテナは、新しいイメージを構築するコマンドの実行対象に使用されるためです。

Containerfile形式およびビルド手順の詳細は、containerfile(5)マニュアル・ページを参照してください。

Buildahコマンドの完全なリストは、buildah helpを実行するか、buildah(1)マニュアル・ページを参照してください。

Buildahを使用したContainerfilesからのイメージの作成

既存のContainerfileを直接操作するように設計されたBuildahは、build using dockerfileコマンドまたはbudコマンドを使用して、イメージを構築するためにファイルを処理します。Oracle Container Runtime for Dockerに対応したContainerfileは、イメージの構築に使用できます。また、buildah budコマンドは、docker buildコマンドと同様に動作します。

Containerfileからイメージを構築するには、ファイルのあるディレクトリに移動し、次のように入力します。

sudo buildah bud -t imagename .

デフォルトのContainerfileファイル名を使用しない場合は、-f filenameオプションを使用します。

作成したイメージがタグ付けされ、ローカル・イメージ・リストに追加されます。新しいイメージが使用可能であることを確認するには、次のように入力します。

sudo buildah images

ローカルにホストされたイメージはBuildahとPodmanで共有されるため、イメージはすぐにPodmanで使用できることに注意してください。ただし、Podmanがインストールされている他のシステムでこれらのイメージを使用できるようにするレジストリにイメージをプッシュすることを検討してください。

作業用コンテナ内でイメージを実行することによってイメージを検証するには、次のように入力します。

sudo buildah from imagename

buildah fromコマンドでは、あらゆるイメージ用の作業用コンテナを作成します。詳細は、Buildahを使用したイメージの変更を参照してください。

Buildahを使用したイメージの変更

イメージを変更するには、Buildah内で作業用コンテナ・インスタンスとして実行し、buildah runコマンドを発行します。これらのコマンドは、ContainerfileRUN文と同等です。作業用コンテナの変更を完了した後、buildah commitを実行して、作業用コンテナの現在のステータスに基づいて新しいイメージを生成します。

イメージと作業用コンテナの設定

Buildahでは、Podmanを使用してイメージをプルする場合と同じ方法でレジストリからイメージをプルできます。たとえば、oraclelinux:7-slimイメージをプルするには、次のように入力します。

sudo buildah pull container-registry.oracle.com/os/oraclelinux:7-slim

ローカルにホストされたイメージは、BuildahとPodmanの間で共有されます。Buildahでいずれかのイメージから作業用コンテナを開始する場合は、buildah fromコマンドを使用します。

sudo buildah from oraclelinux:7-slim
oraclelinux-working-container-1

プル・リクエストとbuildah fromコマンドを組み合せることで、リモート・レジストリでホストされているイメージからコンテナを開始できます。

sudo buildah from container-registry.oracle.com/os/oraclelinux:7-slim

次のいずれかの方法で作業用コンテナを作成して開始できます。

  • PodmanまたはBuildahを使用してプルしたローカル・イメージの使用
  • Containerfileから生成されたイメージの使用
  • リモート・レジストリから直接プルしたリモート・イメージの使用。

Buildah内で使用可能なコンテナを確認するには、次のコマンドを発行します。

sudo buildah containers

作業用コンテナに対する変更

PodmanとBuildahの主要な相違点は、runの取扱いにあります。Podmanでは、このコマンドは同等のDockerコマンドをエミュレートし、新しいコンテナでプロセスを実行します。Buildahでは、コマンドはContainerfileからのRUN文と同じように動作し、既存の作業用コンテナに影響します。このコマンドを使用すると、作業用コンテナに対して一連のコマンドを実行してコンテナを検証し、イメージとして保存できる状態にコンテナを変更できます。

buildah runコマンドを使用して、パッケージのインストールやシステム変更などのシェル・コマンドを作業用コンテナで実行します。次のコマンドは、特定のコンテナ内のOracle Linuxリリースを表示します。

sudo buildah run oraclelinux-working-container-1 cat /etc/oracle-release
Oracle Linux Server release 8.2

作業用コンテナにファイルをコピーするには、次のように入力します。

sudo buildah copy oraclelinux-working-container-1 /path/to/yourscript /usr/local/bin

さらに、作業用コンテナ内のファイルは、そのファイルのrootファイル・システムをローカル・ホストにマウントすることで変更できます。

sudo buildah mount oraclelinux-working-container-1
/var/lib/containers/storage/overlay/5a595715c70a2d1a5582836d55722fbfc2ab9bf3/merged

このコマンドは、コンテナのrootファイル・システムにアクセスできるマウント・ポイントを返します。

コンテナ内に直接反映されるファイル・システムを変更するには、次のように入力します。

sudo touch /var/lib/containers/storage/overlay/5a595715c70a2d1a5582836d55722fbfc2ab9bf3/merged/testfile
sudo buildah run oraclelinux-working-container-1 ls /testfile
testfile

パラメータなしでbuildah mountコマンドを実行すると、すべてのマウントが表示されるため、マウントされているコンテナと、ホスト・システムのマウント・ポイントへのパスを確認できます。コンテナは、コンテナIDごとにリストされるため、buildah containersコマンドで返される情報に基づいて、コンテナの名前との照合が必要になります。

ベスト・プラクティスとして、コンテナ・ファイル・システムの作業が終了したらbuildah unmountコマンドを使用してアンマウントします。このコマンドはコンテナ名を認識しないため、次のようにコンテナIDを指定して使用する必要があることに注意してください。

sudo buildah unmount 5617ebfbe265

作業用コンテナからの新しいイメージの作成

作業用コンテナへの変更は、イメージにコミットされるまでの一時的なものです。Buildahを使用すると、Podmanですぐに使用できるように、イメージをローカルにコミットできます。ただし、Buildahには、書込みアクセス権があるレジストリにコミットする機能もあります。レジストリに関連するアクセスの処理(認証や証明書の検証要件など)に役立つ様々なオプションを使用できます。これらのオプションの詳細は、buildah-commit(1)のマニュアル・ページを参照してください。

作業用コンテナに対する変更をイメージとして永続的に格納するには、buildah commitコマンドを使用します。このコマンドを実行すると、Podman環境で同様のコンテナを開始できます。次の例では、作業用コンテナがローカルにコミットされ、同時に、Buildah環境から作業用コンテナが削除されるようにするための--rmオプションを使用しています。

sudo buildah commit --rm oraclelinux-working-container-1 new-image

ローカル・レジストリにコミットするには、次のように入力します。

sudo buildah commit --rm oraclelinux-working-container-1 docker://localhost:5000/new-image

レジストリに直接コミットすることはローカル・コミットの実行に相当し、その後、buildah pushコマンドを使用してレジストリにプッシュします。

buildah inspectコマンドを使用して、ビルド・イメージ・メタデータを確認することもできます。コマンド出力は、たとえばイメージまたは作業用コンテナに関する過去の変更およびその他の情報を識別するために役立ちます。

sudo buildah inspect --type image new-image

作業用コンテナの削除

buildah rmコマンドは、コンテナを停止してBuildahのコンテナ・リストから削除します。

sudo buildah rm oraclelinux-working-container-1

このコマンドでは、作業用コンテナを削除して、そのコンテナ用に設定されていた可能性があるすべてのマウントをアンマウントします。コンテナを削除すると、作業用コンテナに対する変更内容は失われます。削除前に作業用コンテナのイメージを作成していないと、失われた変更内容を取り戻せなくなります。

このコマンドは、Buildah環境から作業用コンテナのみを削除します。Podmanで実行されているコンテナや既存のイメージには影響しません。イメージはPodmanとBuildahで共有されるため、buildah rmiコマンドを使用してイメージを削除すると、そのイメージはPodmanでも削除されます。

ノート:

前述の項で説明したように、buildah commitコマンドで--rmオプションを使用すると、作業用コンテナをコミットし、同時にBuildahのコンテナ・リストから削除できます。「作業用コンテナからの新しいイメージの作成」を参照してください。

レジストリへのイメージのプッシュ

BuildahとPodmanは互換的にイメージを処理するため、イメージの操作に使用するコマンドの大部分はツール間で再現されて同じ操作を実行します。たとえば、buildah pushコマンドとpodman pushコマンドは同様に動作します。どちらのコマンドを使用しても、ローカル・ストレージに存在しているイメージを書込みアクセス権のあるレジストリにプッシュできます。

Docker Registry HTTP API V2を使用するレジストリにローカル・イメージをプッシュするには、次のコマンドを実行します。

sudo buildah push imagename docker://registry.example.com/imagename:tag

PodmanはDocker CLIとの構文の互換性を維持しようとするため、このコマンドは次の構文を使用して実行できます。次のサンプル・コマンドは、ローカル・イメージがレジストリ名およびタグとともに格納されていることを前提としています。

sudo buildah push registry.example.com/imagename:tag

レジストリはHTTPベースのリソースであるため、通常はTLS/SSL証明書を使用して保護され、認証が必要になることがあります。これらの要件をコマンドで処理する方法に関連する複数のオプションを使用できます。これらのオプションの詳細は、buildah-push(1)マニュアル・ページを参照してください。

BuildahとPodmanは、どちらもイメージを別のフォーマットにプッシュできます。この機能は、レジストリへのアクセス権がない場合に、共有および再利用可能なアーカイブ・フォーマットを作成するために使用します。たとえば、その環境でdocker saveコマンドを実行した結果と同様のDocker互換アーカイブを作成できます。次のように入力します。

sudo buildah push imagename docker-archive:/path/to/archive-file:image:tag

このコマンドのdocker-archiveoci-archiveに置き換えることで、Open Container Initiative (OCI)仕様に準拠したアーカイブを生成します。