Skip to main content

Multi-Architecture Builds

The platform supports both linux/amd64 and linux/arm64 architectures. This guide covers building multi-architecture container images.

Using Docker Buildx

Docker Buildx enables cross-platform builds from a single machine using QEMU emulation.

With p6m-actions

The simplest approach uses language-specific docker publish actions:

- name: Set up Docker Buildx
uses: p6m-actions/docker-buildx-setup@v1

- name: Build and push
uses: p6m-actions/python-uv-docker-publish@v1
with:
image: ${{ env.REGISTRY }}/my-service
tags: ${{ steps.version.outputs.version }}
platforms: linux/amd64,linux/arm64

Manual Buildx Commands

For custom builds, use Docker Buildx directly:

- name: Set up Docker Buildx
uses: p6m-actions/docker-buildx-setup@v1

- name: Build and push
run: |
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag ${{ env.REGISTRY }}/my-service:${{ env.VERSION }} \
--push \
.

Parallel Native Builds

For faster builds—especially with compiled languages like Rust—build each architecture natively on matching runners:

jobs:
build-amd64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t my-service:amd64 .
- run: docker push my-service:amd64

build-arm64:
runs-on: ubuntu-24.04-arm
steps:
- uses: actions/checkout@v4
- run: docker build -t my-service:arm64 .
- run: docker push my-service:arm64

manifest:
needs: [build-amd64, build-arm64]
runs-on: ubuntu-latest
steps:
- run: |
docker manifest create my-service:latest \
my-service:amd64 \
my-service:arm64
docker manifest push my-service:latest

When to Use Native Builds

ApproachBest ForTrade-off
Buildx (QEMU)Interpreted languages (Python, JS)Simpler workflow, slower for compiled code
Parallel nativeCompiled languages (Rust, Go, C++)Faster builds, more complex workflow