Skip to content

feat: add arm64 Docker images and multi-version base image support#1762

Merged
ivan-aksamentov merged 8 commits intomasterfrom
chore/docker-multiplatform
Mar 17, 2026
Merged

feat: add arm64 Docker images and multi-version base image support#1762
ivan-aksamentov merged 8 commits intomasterfrom
chore/docker-multiplatform

Conversation

@ivan-aksamentov
Copy link
Copy Markdown
Member

Add arm64 multi-platform Docker images alongside amd64, and build each image across multiple base image versions (6 Alpine releases spanning ~3 years, 3 Debian releases spanning ~5 years) so users on older systems can pin a compatible base. ARM64 binaries were already built in CI but not packaged into Docker images. The publish script now uses docker buildx with --platform linux/amd64,linux/arm64 and GNU parallel to build all variants concurrently, with a --run flag for smoke-testing every image on both platforms before publishing.

  • Multi-platform Docker images (amd64 + arm64) via buildx TARGETARCH in COPY paths
  • Multiple base image versions per distro, configured in docker/docker-prod.json
  • Python script (docker-prod-update) to refresh versions from endoflife.date API
  • Parallel builds and smoke tests via GNU parallel
  • --run flag: build, load, test nextclade --version on both platforms
  • --push --run: test before publish (build+load, smoke test, then push)
  • CI dry-run job on every non-release build; publish job on release only
  • QEMU and buildx setup in CI workflow

Resolves: #1761

- Use multi-stage per-arch binary selection via TARGETARCH in production Dockerfiles
- Replace `docker build` + `docker push` with `docker buildx build --platform linux/amd64,linux/arm64`
- Add QEMU and buildx setup to CI publish-to-docker-hub job

Closes #1761
- Parameterize base image version in alpine and debian Dockerfiles via BASE_VERSION ARG
- Read version lists from docker/docker-prod.json (6 Alpine, 3 Debian)
- Add docker-prod-update script to refresh versions from endoflife.date API
- Generate versioned tags (e.g., alpine3.23) alongside unversioned defaults (e.g., alpine)
…per-arch selection

Replace bin-amd64/bin-arm64 intermediate stages with the canonical Docker
pattern: COPY ".out/nextclade-${TARGETARCH}-linux-musl". Publish script
creates symlinks to bridge Docker naming (amd64/arm64) to Rust triples
(x86_64/aarch64).
Build, load, and run "nextclade --version" on linux/amd64 and linux/arm64
for each image variant as a smoke test.
Build and smoke-test all Docker image variants (--run) on every CI run,
not just on release. Publish job now depends on the dry run passing.
Place binaries in /usr/bin and set PATH for consistent binary location
across all image variants.
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 17, 2026

@ivan-aksamentov ivan-aksamentov force-pushed the chore/docker-multiplatform branch 2 times, most recently from a32e26d to c3b9b8d Compare March 17, 2026 08:18
Single-platform --load works with any buildx driver (no containerd needed).
Build each platform separately, test each, then push multi-platform.
Dry-run job runs on all branches and gates publish on release.
@ivan-aksamentov ivan-aksamentov force-pushed the chore/docker-multiplatform branch from c3b9b8d to c3d0b38 Compare March 17, 2026 08:45
@ivan-aksamentov ivan-aksamentov merged commit ceb00bf into master Mar 17, 2026
3 checks passed
@ivan-aksamentov ivan-aksamentov deleted the chore/docker-multiplatform branch March 17, 2026 08:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

arm64 Docker containers for Nextclade

1 participant