doc/ci/docker/buildah_rootless_multi_arch.md
{{< details >}}
{{< /details >}}
Use Buildah to build images for multiple CPU architectures. Multi-platform builds create images that work across different hardware platforms, and Docker automatically selects the appropriate image for each deployment target.
To build multi-platform images with Buildah:
Running jobs on their respective architectures avoids performance issues from CPU instruction translation. However, you can run both builds on a single architecture if needed. Building for non-native architecture may result in slower build times.
The following example uses two GitLab-hosted runners on Linux:
saas-linux-small-arm64saas-linux-small-amd64stages:
- 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
This pipeline creates architecture-specific images tagged with amd64 and arm64,
then combines them into a single manifest available under the latest tag.
If you encounter registry authentication failures:
CI_REGISTRY_USER and CI_REGISTRY_PASSWORD variables are available.For multi-platform build issues:
Dockerfile support the target architectures.Dockerfile for architecture-specific logic.Error during unshare(CLONE_NEWUSER): Operation not permittedWhen you use Buildah or Docker BuildKit in rootless mode to build Docker images in CI/CD jobs,
you might encounter an Error during unshare(CLONE_NEWUSER): Operation not permitted.
This error occurs when the required security options are not set for rootless container builds.
To resolve this issue, configure the [runners.docker] section in the runner's config.toml file:
[runners.docker]
security_opt = ["seccomp:unconfined", "apparmor:unconfined"]
For more information, see BuildKit rootless Docker builds and security requirements.