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
| Approach | Best For | Trade-off |
|---|---|---|
| Buildx (QEMU) | Interpreted languages (Python, JS) | Simpler workflow, slower for compiled code |
| Parallel native | Compiled languages (Rust, Go, C++) | Faster builds, more complex workflow |
Related
- Containerization — Dockerfile patterns and security
- CI/CD Overview — Build pipeline architecture
- Language Reference — Language-specific build actions