11 ビルマ
Buildahユーティリティを使用して、Podmanで使用するカスタムOpen Container Initiative準拠のコンテナ・イメージを作成します。
Buildahユーティリティは、機能的にはPodmanと似ていますが、Open Container Initiative準拠のイメージを構築するためにPodmanから独立性を維持しています。 BuildahとPodmanの主な違いは、runコマンドの処理方法にあります。 Buildahの目的はイメージを構築することであるため、runコマンドは、コンテナ・イメージの作成を自動化するための設定を含む構成ファイルであるコンテナ・ファイル内のRUN文と同じように動作します。 この違いにより、Podmanで実行されている本番レベルのコンテナ・インフラストラクチャからイメージ・ビルドを分離し、既存のContainerfileビルド手順を簡単に処理できます。
Buildahを使用して、既存のレジストリからイメージをプルし、それらを変更して、より特殊な機能を備えた新しいイメージを作成します。 Buildahを既存のContainerfileとともに使用してイメージを作成するか、イメージを直接プルして、Buildah環境内で実行されているコンテナ内でイメージを変更できます。
PodmanとBuildahは同じローカル・イメージ・ストアを使用します。つまり、Buildahで構築したイメージからPodmanのコンテナを起動できます。 また、Buildahを使用した新しいイメージの構築のために使用するベース・イメージとして、Podmanでローカルにプルしていたイメージを使用することもできます。 ローカル・イメージは共有されますが、コンテナ自体はBuildahとPodmanで個別に実行されます。 PodmanはBuildahで実行しているコンテナにアクセスできません。また、BuildahはPodmanで実行しているコンテナにアクセスできません。 これは、Buildahで実行するコンテナは、新しいイメージを構築するコマンドの実行対象に使用されるためです。
Buildahでビルドしたイメージを格納するプライベート・コンテナ・レジストリを作成すると役立つ場合があります。 プライベート・レジストリを使用して、作成したイメージをプッシュし、イメージを使用してコンテナを構築する必要がある可能性がある他のPodmanクライアントからプルできます。 レジストリの作成の詳細は、プライベート・コンテナ・レジストリを参照してください。
Containerfile形式およびビルド手順の詳細は、containerfile(5)マニュアル・ページを参照してください。
Buildahコマンドの完全なリストについては、buildah --helpコマンドを使用するか、buildah(1)マニュアル・ページを参照してください。
ノート:
ほとんどのBuildah操作では、sudoを使用する必要はありません。 Buildahを標準ユーザーとして使用することをお薦めします。 特権アクセスが必要な場合、buildah unshareコマンドを使用して、特権Buildahシェルに入ります。 詳細は、buildah-unshare(1)マニュアル・ページを参照してください。
コンテナファイルからのイメージの作成
buildah buildコマンドを使用して、コンテナ・ファイルからコンテナ・イメージを構築します。
Buildahは、既存のContainerfileと直接連携するように設計されており、buildah buildコマンド(buildah build-using-dockerfileおよびbuildah budコマンドの別名)を使用してファイルを処理してコンテナ・イメージを構築します。 buildah buildコマンドは、docker buildコマンドと同様に動作します。
ContainerfileまたはDockerfileのデフォルトのファイル名を使用して、コンテナ・イメージを指定できます。 別のファイル名またはファイル拡張子を持つ名前を使用する場合、buildah buildコマンドに-fオプションを指定しないかぎり、これらは認識されません。
buildah commitコマンドの使用方法の詳細は、buildah-commit(1)マニュアル・ページを参照してください。
イメージからのBuildahコンテナの作成
コンテナ・レジストリからイメージをプルし、それを使用してBuildahコンテナを作成します。
Buildahは、Podmanを使用してイメージをプルする場合と同様に、buildah pullコマンドを使用してコンテナ・レジストリからイメージをプルできます。 buildah fromコマンドを使用して、イメージからBuildahコンテナを起動します。 これらのコマンドは個別に実行することも、結合することもできます。
イメージの変更
Buildahコンテナと対話して、ソフトウェアのインストール、ファイルの追加、およびコンテナのボリュームのマウントを行います。
イメージを変更するには、Buildah内でコンテナ・インスタンスとして実行し、buildah runコマンドを使用します。 このコマンドは、ContainerfileのRUN文と同様に機能します。 たとえば、buildah runコマンドを使用して、パッケージのインストールやOSの変更など、Buildahコンテナのシェル・コマンドを実行できます。
buildah copyやbuildah mountなどの他のコマンドを使用して、Buildahコンテナと対話することもできます。
この例の多くは、Oracle Linux 9イメージを含むBuildahコンテナがすでに作成および実行されていることを前提としています。 このコンテナを作成するコマンドは次のとおりです。
container=$(buildah from container-registry.oracle.com/os/oraclelinux:9)
Buildahコンテナ名は$container変数として設定され、例を簡単に試すことができます。
例11-1 Buildahコンテナへのパッケージのインストール
buildah runコマンドを使用して、コンテナにソフトウェア・パッケージをインストールします。 この例では、nginxをインストールします。
buildah run $container dnf -y install nginx
例11-2 Buildahコンテナでのシェル・コマンドの実行
buildah runコマンドを使用して、Oracle LinuxリリースをBuildahコンテナに表示します。
buildah run $container cat /etc/oracle-release
出力は次のようになります:
Oracle Linux Server release 9.6
例11-3 Buildahコンテナへのファイルのコピー
buildah copyコマンドを使用して、Buildahコンテナにファイルをコピーします。
コンテンツを含むmytext.txtという名前のファイルを作成します。 たとえば:
This is some text.
mytext.txtファイルをコンテナの/tmpディレクトリにコピーします。
buildah copy $container mytext.txt /tmp
buildah runコマンドを使用して、catコマンドを使用してファイルの内容を表示します。
buildah run $container cat /tmp/mytext.txt
出力は次のようになります:
This is some text.
例11-4 Buildahコンテナのボリュームのマウント
ローカル・ホストにルート・ファイル・システムをマウントすることで、作業コンテナ内でファイルを変更できます。
まず、昇格された権限を持つBuildahネームスペースに入る必要があります。 これは、ルートレスモードでオーバーレイドライバを使用し、Buildah unshareセッションと呼ばれます。 詳細は、buildah-unshare(1)マニュアル・ページを参照してください。
buildah unshare
コマンドライン・ユーザーがユーザーを表示するように変更すると、rootになります。
共有解除セッションにコンテナを作成し、コンテナのボリュームをマウントします。
container=$(buildah from oraclelinux:9)
mnt=$(buildah mount $container)
これで、ボリューム・マウントを操作できます。 たとえば、コンテナのボリュームにソフトウェア・パッケージをインストールします。
dnf install --installroot $mnt httpd
終了したら、コンテナをアンマウントします。
buildah unmount $container
exitコマンドを使用して元のシェルに戻ります。
イメージへのBuildahコンテナのコミット
コンテナへの変更が完了したら、buildah commitコマンドを使用して、Buildahコンテナの現在のステータスに基づいて新しいイメージを生成します。
Buildahコンテナへの変更は、イメージにコミットされるまで一時的です。 Buildahイメージをローカル・ストレージにコミットして、Podmanですぐに使用できるようにします。 Buildahには、イメージをコンテナ・レジストリにプッシュするオプションも用意されており、ユーザー認証や証明書検証など、レジストリで認証するオプションもあります。 レジストリへの書込みアクセス権を持っている必要があるため、この目的でプライベート・レジストリを作成すると役立つ場合があります。 プライベート・レジストリの作成と使用の詳細は、プライベート・コンテナ・レジストリを参照してください。
Buildahコンテナに対する変更をイメージに永続的に格納するには、buildah commitコマンドを使用します。 buildah commitコマンドの使用方法の詳細は、buildah-commit(1)マニュアル・ページを参照してください。
例11-5ローカル・ストレージへのBuildahイメージのコミット
Buildahコンテナをローカル・ストレージのイメージにコミットします。 --rmオプションを含めて、Buildah環境から作業用コンテナを同時に削除します。
buildah commit --rm oraclelinux-working-container myol9:v1
イメージが作成されたことを確認するには、次を使用します。
buildah images
出力は次のようになります:
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/myol9 v1 6afd745ed1cf 8 seconds ago 519 MB
例11-6プライベート・セキュア・レジストリへのBuildahイメージのコミット
Buildahコンテナをコミットし、イメージをプライベート・セキュア・レジストリにプッシュします。
buildah commit --rm oraclelinux-working-container docker://myregistry.example.com:5000/myol9:v1
レジストリに直接コミットすることは、ローカル・コミットを実行してから、後でbuildah pushコマンドを使用してレジストリにプッシュすることと同じです。
Buildahを使用してイメージをプルできることを確認します。
buildah pull myregistry.example.com:5000/myol9:v1
例11-7セキュアでないプライベート・レジストリへのBuildahイメージのコミット
Buildahコンテナをコミットし、イメージをローカルの安全でないレジストリにプッシュします。
buildah commit --tls-verify=false --rm oraclelinux-working-container docker://localhost:5000/myol9:v1
Buildahを使用してイメージをプルできることを確認します。
buildah pull --tls-verify=false localhost:5000/myol9:v1
レジストリへのイメージのプッシュ
buildah pushコマンドを使用して、コンテナ・イメージをローカル・ストレージからコンテナ・レジストリにプッシュします。
BuildahとPodmanはイメージを同じように処理するため、イメージの操作に使用するコマンドのほとんどは、これらのツール間でレプリケートされ、同じ操作を実行します。 たとえば、buildah pushコマンドとpodman pushコマンドは同じように動作します。 これらのコマンドのいずれかを使用して、書込みアクセス権があるコンテナ・レジストリにイメージをプッシュできます。 レジストリへの書込みアクセス権がまだない場合は、イメージをプッシュおよび共有するプライベート・レジストリを作成できます。 レジストリの作成の詳細は、プライベート・コンテナ・レジストリを参照してください。
BuildahとPodmanは、画像を他のフォーマットにプッシュすることもできます。 つまり、レジストリへのアクセス権がない場合は、共有および再利用できるアーカイブ形式を作成できます。 たとえば、Docker互換のアーカイブを作成して、docker saveコマンドの使用と同様のアーカイブ・ファイルを作成できます。 次の形式を使用します。
buildah push imagename docker-archive:/path/to/archive-file:image:tag
コマンドのdocker-archiveをoci-archiveに変更して、Open Container Initiativeの仕様に準拠したアーカイブを生成します。
buildah pushコマンドの詳細は、buildah-push(1)マニュアル・ページを参照してください。
例11-8セキュアなプライベート・レジストリへのイメージのプッシュ
buildah push ol9image:v1 docker://myregistry.example.com:5000/myol9:v1
Buildahを使用してイメージをプルできることを確認します。
buildah pull myregistry.example.com:5000/myol9:v1
例11-9セキュアでないプライベート・レジストリへのイメージのコミット
buildah push --tls-verify=false ol9image:v1 docker://localhost:5000/myol9:v1
Buildahを使用してイメージをプルできることを確認します。
buildah pull --tls-verify=false localhost:5000/myol9:v1
例11-10 Docker互換アーカイブ・ファイルの作成
buildah push ol9image:v1 docker-archive:/tmp/ol9image.tar:myol9:v1
アーカイブ・ファイルは、イメージを含む/tmp/ol9image.tarに作成されます。
Buildahコンテナの削除
buildah rmコマンドを使用して、Buildahコンテナを削除します。 このコマンドは、Podmanコンテナには影響しません。
buildah rmコマンドは、コンテナを停止し、Buildahコンテナ・リストから削除します。 作業中のコンテナを削除し、設定されている可能性のあるボリューム・マウントをアンマウントします。 コンテナが削除されると、作業コンテナに加えた変更は失われ、コンテナを削除する前にそのコンテナのイメージを作成していないかぎり取得できません。
buildah rmは、Buildah環境から作業用コンテナのみを削除します。 Podmanで実行されているコンテナ、または既存のイメージは影響を受けません。
buildah rmコマンドの使用方法の詳細は、buildah-rm(1)マニュアル・ページを参照してください。
また、buildah commitコマンドに--rmオプションを指定して作業中のコンテナをコミットし、Buildahコンテナ・リストから同時に削除することで、イメージへのコミット時にコンテナを削除することもできます。 イメージへのBuildahコンテナのコミットを参照してください。
例11-11 Buildahコンテナの削除
buildah rm oraclelinux-working-container
例11-12すべてのBuildahコンテナの削除
buildah rm --all
イメージの削除
buildah rmiコマンドを使用してイメージを削除します。 これにより、Podman内のイメージも削除されます。
buildah rmiコマンドは、BuildahおよびPodmanイメージ・リストからイメージを削除します。 イメージはPodmanとBuildahの間で共有されるため、このコマンドでイメージを削除すると、Podmanでも削除されます。
buildah rmiコマンドの使用方法の詳細は、buildah-rmi(1)マニュアル・ページを参照してください。
例11-13イメージの削除
buildah rmi localhost/myimage:latest
例11-14すべてのイメージの削除
buildah rmi --all
イメージまたはコンテナの検査
buildah inspectコマンドは、Buildahで作成されたイメージまたはコンテナのメタデータおよび履歴を出力します。 出力はJSON配列であり、イメージまたはコンテナに関する履歴変更およびその他の情報を識別するのに役立ちます。
buildah inspectコマンドの使用方法の詳細は、buildah-inspect(1)マニュアル・ページを参照してください。
例11-15コンテナの検査
buildah inspectコマンドを使用して、コンテナを検査します。
buildah inspect image --type container oraclelinux-working-container
例11-16イメージの検査
buildah inspectコマンドを使用して、イメージを検査します。
buildah inspect --type image myol9:v1