Buildahを使用してマルチプラットフォームイメージをビルドする
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
Buildahを使用して、複数のCPUアーキテクチャ用のイメージをビルドします。マルチプラットフォームビルドでは、異なるハードウェアプラットフォームで動作するイメージが作成され、Dockerは各デプロイターゲットに適切なイメージを自動的に選択します。
前提要件
- イメージのビルド元となるDockerfile
- (オプション)異なるCPUアーキテクチャで実行されているGitLab Runner
マルチプラットフォームイメージをビルドする
Buildahを使用してマルチプラットフォームイメージをビルドするには、次の手順を実行します:
- ターゲットアーキテクチャごとに個別のビルドジョブを設定します。
- アーキテクチャ固有のイメージを組み合わせるジョブを作成します。
- 結合されたマニフェストをレジストリにプッシュするようにジョブを設定します。
それぞれのアーキテクチャでジョブを実行することで、CPU命令の変換によるパフォーマンスの問題を回避できます。ただし、必要に応じて、単一のアーキテクチャで両方のビルドを実行できます。非ネイティブアーキテクチャ用にビルドすると、ビルド時間が遅くなる可能性があります。
次の例では、2つのGitLabホスト型Runner(Linux)を使用します:
saas-linux-small-arm64saas-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ビルドおよびセキュリティ要件を参照してください。