正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

Buildahを使用してマルチプラットフォームイメージをビルドする

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

Buildahを使用して、複数のCPUアーキテクチャ用のイメージをビルドします。マルチプラットフォームビルドでは、異なるハードウェアプラットフォームで動作するイメージが作成され、Dockerは各デプロイターゲットに適切なイメージを自動的に選択します。

前提要件

  • イメージのビルド元となるDockerfile
  • (オプション)異なるCPUアーキテクチャで実行されているGitLab Runner

マルチプラットフォームイメージをビルドする

Buildahを使用してマルチプラットフォームイメージをビルドするには、次の手順を実行します:

  1. ターゲットアーキテクチャごとに個別のビルドジョブを設定します。
  2. アーキテクチャ固有のイメージを組み合わせるジョブを作成します。
  3. 結合されたマニフェストをレジストリにプッシュするようにジョブを設定します。

それぞれのアーキテクチャでジョブを実行することで、CPU命令の変換によるパフォーマンスの問題を回避できます。ただし、必要に応じて、単一のアーキテクチャで両方のビルドを実行できます。非ネイティブアーキテクチャ用にビルドすると、ビルド時間が遅くなる可能性があります。

次の例では、2つのGitLabホスト型Runner(Linux)を使用します:

  • saas-linux-small-arm64
  • saas-linux-small-amd64
stages:
  - build

variables:
  STORAGE_DRIVER: vfs
  BUILDAH_FORMAT: docker
  FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE:latest"

default:
  image: quay.io/buildah/stable
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY

build-amd64:
  stage: build
  tags:
    - saas-linux-small-amd64
  script:
    - buildah build --platform=linux/amd64 -t $CI_REGISTRY_IMAGE:amd64 .
    - buildah push $CI_REGISTRY_IMAGE:amd64

build-arm64:
  stage: build
  tags:
    - saas-linux-small-arm64
  script:
    - buildah build --platform=linux/arm64/v8 -t $CI_REGISTRY_IMAGE:arm64 .
    - buildah push $CI_REGISTRY_IMAGE:arm64

create_manifest:
  stage: build
  needs: ["build-arm64", "build-amd64"]
  tags:
    - saas-linux-small-amd64
  script:
    - buildah manifest create $FQ_IMAGE_NAME
    - buildah manifest add $FQ_IMAGE_NAME docker://$CI_REGISTRY_IMAGE:amd64
    - buildah manifest add $FQ_IMAGE_NAME docker://$CI_REGISTRY_IMAGE:arm64
    - buildah manifest push --all $FQ_IMAGE_NAME

このパイプラインは、amd64およびarm64でタグ付けされたアーキテクチャ固有のイメージを作成し、それらをlatestタグで使用可能な単一のマニフェストに結合します。

トラブルシューティング

認証エラーでビルドに失敗する

レジストリの認証に失敗した場合は、次のようにします:

  • CI_REGISTRY_USERおよびCI_REGISTRY_PASSWORD変数が利用可能であることを確認します。
  • ターゲットレジストリへのプッシュ権限があることを確認します。
  • 外部レジストリの場合は、プロジェクトのCI/CD変数で認証情報が正しく設定されていることを確認してください。

マルチプラットフォームビルドに失敗する

マルチプラットフォームビルドの問題:

  • Dockerfileのベースイメージがターゲットアーキテクチャをサポートしていることを確認します。
  • アーキテクチャ固有の依存関係がすべてのターゲットプラットフォームで利用可能であることを確認します。
  • アーキテクチャ固有のロジックのために、Dockerfileで条件ステートメントを使用することを検討してください。

エラー: Error during unshare(CLONE_NEWUSER): Operation not permitted

BuildahまたはDocker BuildKitをルートレスコンテナモードで使用して、CI/CDジョブでDockerイメージをビルドすると、Error during unshare(CLONE_NEWUSER): Operation not permittedが発生する可能性があります。

このエラーは、ルートレスコンテナのビルドに必要なセキュリティオプションが設定されていない場合に発生します。

この問題を解決するには、Runnerのconfig.tomlファイルの[runners.docker]セクションを設定します:

[runners.docker]
  security_opt = ["seccomp:unconfined", "apparmor:unconfined"]

詳細については、BuildKitルートレスコンテナDockerビルドおよびセキュリティ要件を参照してください。