MacでPodmanを使ってマルチアーキテクチャ(Intel & ARM)イメージを一度にビルドする方法

最近、クラウドサーバー(Intel/AMD)と開発用個人PC(Apple SiliconなどのARM)のアーキテクチャが断片化されたことにより、単一環境に依存しないマルチアーキテクチャ(Multi-Architecture)コンテナイメージの必要性が高まっています。この記事では、Mac環境でPodmanのみを使用して、Intel(linux/amd64)とARM(linux/arm64)の両方のアーキテクチャで動作するイメージを構築する方法を詳しく説明します。

1. マルチアーキテクチャイメージとマニフェストの概念 🧠

一般的に、コンテナイメージはビルドを実行するホストのアーキテクチャに従います。したがって、Apple Silicon Macで単純にビルドされたイメージはIntelサーバーでは実行できません。

マルチアーキテクチャイメージは「マニフェストリスト」という概念を使用します。これは、一つのイメージタグ(例:myapp:latest)の下に複数のアーキテクチャ用イメージをまとめる目次のような役割を果たします。ユーザーがイメージをダウンロードする際、コンテナエンジンが現在のシステムのアーキテクチャを確認し、マニフェストから適切なイメージを自動的に選択します。

2. 事前準備: Mac環境のPodman Machine設定 ⚙️

Mac環境ではLinuxカーネルがないため、Podmanはネイティブでは動作せず、仮想マシン(VM)上で実行されます。MacにインストールされたPodmanは、podman machineコマンドを通じてVMを管理します。

Apple Silicon(M1、M2、M3など)Macの場合、このVM内部でQEMUまたはAppleのRosetta 2を介したx86_64(Intel)エミュレーションがデフォルトでサポートされています。したがって、Linux環境のように複雑なエミュレータパッケージをインストールする必要はなく、VMを実行するだけで十分です。

# Podman仮想マシンを初期化(初回のみ)
podman machine init

# Podman仮想マシンを実行
podman machine start

# VMの状態とエミュレーションサポートを確認
podman info

3. 実習用Containerfileの作成 📄

テストのために、アーキテクチャ情報を出力する非常にシンプルなイメージを準備します。ファイル名はContainerfileでもDockerfileでも構いません。

# Containerfile
FROM alpine:latest

# ビルドされた環境のアーキテクチャを出力するコマンド
CMD ["uname", "-m"]

4. 方法1: 単一コマンドでマルチアーキテクチャビルド(推奨) 🚀

Podmanは、–platformフラグと–manifestフラグを組み合わせて、一度のコマンドで複数のアーキテクチャイメージをビルドし、マニフェストとしてまとめる機能を提供します。

# linux/amd64とlinux/arm64プラットフォームを同時にビルドし、my-multi-app:latestマニフェストを作成
podman build --platform linux/amd64,linux/arm64 --manifest my-multi-app:latest .

このコマンドが実行される過程は以下の通りです。

  1. amd64アーキテクチャ環境向けに隔離されたコンテナビルドを実行します。(Macのエミュレーションを活用)
  2. arm64アーキテクチャ環境向けに隔離されたコンテナビルドを実行します。(Apple Siliconネイティブ)
  3. 2つの独立したイメージをローカルストレージに保存します。
  4. my-multi-app:latestという名前のマニフェストリストを作成し、先にビルドした2つのイメージを一つに結合します。

5. 方法2: 個別ビルド後にマニフェストで結合 🧩

ビルドプロセスがアーキテクチャごとに異なる場合や、すでにビルド済みの既存イメージをまとめる必要がある場合は、手動でマニフェストを制御できます。

# 1. 空のマニフェストを作成
podman manifest create my-manual-app:latest

# 2. アーキテクチャごとにイメージを個別にビルド
podman build --platform linux/amd64 -t my-manual-app:amd64 .
podman build --platform linux/arm64 -t my-manual-app:arm64 .

# 3. 作成されたマニフェストに個別のイメージを追加
podman manifest add my-manual-app:latest localhost/my-manual-app:amd64
podman manifest add my-manual-app:latest localhost/my-manual-app:arm64

6. 結果確認とレジストリへのプッシュ ☁️

生成されたマニフェストが複数のアーキテクチャを正常に含んでいるかを確認します。

# マニフェスト情報を検査
podman manifest inspect my-multi-app:latest

出力されるJSON情報のmanifests配列内にamd64とarm64の両方が存在することを確認します。確認が完了したら、外部コンテナレジストリ(Docker Hub、AWS ECRなど)にプッシュします。

# マニフェスト自体をレジストリにプッシュ
# (マニフェストにリンクされたすべてのアーキテクチャのイメージレイヤーが一度にアップロードされます)
podman manifest push my-multi-app:latest docker://docker.io/myusername/my-multi-app:latest

マニフェストのプッシュが完了すると、IntelサーバーやARM PCなど、どのデバイスからでもpodman run –rm myusername/my-multi-app:latestを実行した際に、そのデバイスのアーキテクチャに合ったコンテナが正確に起動します。



Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です