Docker Bake Goes GA and Makes Multi-Architecture Builds Native
Docker promoted Buildx Bake to general availability with Docker Desktop 4.38, eliminating the last barrier to multi-platform builds for teams still juggling separate per-architecture scripts.
February 2025. Docker ships Docker Desktop 4.38 and promotes Docker Bake to general availability after years in experimental status. The entire proposition collapses into one command: docker buildx bake.
June 2026. AWS Graviton4 powers the sixth generation of EC2 instances, delivering 30% more performance than Graviton3. AmpereOne doubles core density per socket with native ARM64 server chips. Apple Silicon is the default developer workstation. And yet a quiet majority of teams still maintain two separate build pipelines — one for linux/amd64, one for linux/arm64 — held together by 400-line Makefile blobs and shell scripts no one dares touch.
Docker Bake closes that gap. It does not just automate builds; it makes multi-architecture native, declarative, and reproducible from a single version-controlled file. The kind of shift that turns a daily friction point into a non-issue.
What Docker Bake replaces — and why it matters right now
Without Bake, a multi-platform build looks like this:
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag registry.example.com/app:latest \
--tag registry.example.com/app:v1.2.3 \
--cache-from type=registry,ref=registry.example.com/app:cache \
--cache-to type=registry,ref=registry.example.com/app:cache,mode=max \
--provenance=true \
--sbom=true \
--push \
. One line, but 8 flags to remember, 3 tag formats to coordinate, and zero isolation between environments. Multiply by 12 microservices, add dev/staging/prod variants, and the shell script explodes. This is the wall every DevOps team hits somewhere between the sixth and twelfth service.
Docker Bake replaces that script with a single declarative file — docker-bake.hcl — checked into the same repo as the code. Same build, same result, but now readable, reviewable, and reproducible from a fresh git clone:
target "app" {
context = "."
dockerfile = "Dockerfile"
platforms = ["linux/amd64", "linux/arm64"]
tags = [
"registry.example.com/app:latest",
"registry.example.com/app:v1.2.3",
]
cache-from = ["type=registry,ref=registry.example.com/app:cache"]
cache-to = ["type=registry,ref=registry.example.com/app:cache,mode=max"]
} The difference is structural. CLI flags become named attributes. Configuration is versioned, reviewed in pull requests, and shared between local machines and CI. One team managing 12 microservices in a monorepo replaced a 400-line Makefile with a 60-line docker-bake.hcl. Adding a new service dropped from 30 lines of boilerplate to 3.
Native multi-platform: no more per-architecture scripts
The core of Bake’s value proposition is native platforms handling. A single platforms = ["linux/amd64", "linux/arm64"] block triggers a parallel build for each architecture with automatic multi-arch manifest creation (OCI image index). Docker or Kubernetes then selects the matching image based on the target node’s architecture.
This simplification lands at the right time. The ARM64 cloud ecosystem crossed a tipping point in 2025-2026:
- AWS Graviton4 (December 2024) delivers up to 30% better performance than Graviton3 while consuming 40% less energy than comparable x86 instances.
- AmpereOne (2025) offers native ARM64 servers with up to 192 cores per socket, driving adoption in on-premise datacenters.
- Apple Silicon dominates the developer fleet: according to the Stack Overflow 2025 survey, 62% of professional developers use a Mac as their primary machine, nearly all of them on Apple Silicon.
The result is a near-universal architecture split: developers build on ARM64, CI runners often run on AMD64, and production mixes both depending on service tiers. Without Bake, this split means duplicated build scripts, inconsistent tags, and windows where one architecture is missing from the registry.
With Bake, the build is atomic: both architectures are produced together, tagged together, pushed together. No more «I forgot to push the ARM64 image.»
Matrix builds: one config, N variants
Bake’s most powerful feature is the matrix build. Where docker buildx build assumes one build per invocation, Bake lets you define a parameterized build that expands into N parallel builds:
target "app" {
matrix = {
mode = ["release", "debug"]
}
name = "app-${mode}"
tags = [mode == "release" ? "app:latest" : "app:dev"]
args = {
BUILD_MODE = mode
}
} Two values for mode produce two distinct builds — app-release and app-debug — executed in parallel, each with its own tags and arguments. Combine with platforms and you get 4 parallel builds (2 modes × 2 architectures) from 4 lines of config.
The dynamic name ("app-${mode}") ensures every matrix combination produces a unique target in the build graph. No tag collisions, no build overwriting another.
The real-world use cases stack up fast:
- Environment variants:
dev/staging/prodwith differentbuild-args(API endpoints, log levels, feature flag keys). One config file, three environments, zero drift. - Runtime variants: a
node:20image and anode:22image to validate compatibility before migrating production. Both built from the same commit, same cache layers, different base images. - Distribution variants:
alpine,debian-slim,distrolessfor different size or compliance constraints. The compliance team gets its SBOM-attested distroless image; the dev team gets its fast-starting Alpine variant. Same bake file, same build run.
This is where Bake genuinely outruns shell scripts. A Makefile can loop over platforms. It can even loop over modes. But it cannot express «for each combination of platform, mode, and base image, build in parallel, merge the manifests, and validate all variables first» — at least not without becoming unmaintainable. Bake handles the combinatorics natively, and the result is a build configuration that shrinks as you add complexity rather than expanding with it.
Docker Build Cloud: distributed builds without the infrastructure
Bake integrates natively with Docker Build Cloud (DBC), Docker’s managed build service. The benefit is immediate for teams building multi-platform images on constrained hardware:
- An ARM64 build emulated via QEMU on an AMD64 machine adds 8 to 12 minutes per image for compiled languages (Go, Rust, C++). On DBC, the ARM64 build runs on native ARM64 hardware — no emulation, no penalty.
- Matrix builds are parallelized across Docker’s cloud infrastructure, not your local CI runner. A build of 12 targets × 2 architectures × 2 modes = 48 parallel builds becomes realistic.
- Cache is shared across builds via DBC’s registry cache, eliminating recompilation of identical layers between targets.
Concrete result: a team that spent 45 minutes per multi-arch build pipeline on a standard GitHub Actions runner dropped to 8 minutes by offloading the build to Docker Build Cloud with Bake.
What GA actually brings
Docker Bake existed in experimental mode for several years. The February 2025 GA ships four improvements that change the production calculus:
- Context deduplication: when multiple targets share the same build context, Bake transfers it once instead of N times. Measurable gain once you cross 3-4 targets.
- Entitlements: fine-grained control over what the builder can access — host network, sandbox, filesystem, SSH agent. Critical for environments where builds access secrets or private registries.
- Composable attributes: reusable configuration blocks (
inherits) that can be mixed and overridden across targets. Docker’s equivalent of CSS mixins. - Variable validation: Terraform-style validation rules for build variables, checked before execution begins. No more builds failing 20 minutes in because
IMAGE_REGISTRYwas malformed.
Verdict
Docker Bake does not solve a problem you do not have yet. It solves the one you have had since your second service hit production.
The relevance threshold is straightforward:
- One image, one architecture:
docker buildx buildis enough. Bake is overhead you do not need yet. - Two architectures or more, or more than two services: Bake pays for itself within the first sprint. Declarative configuration, versioning, and context deduplication justify the afternoon it takes to learn the HCL syntax. The first time someone suggests «let’s add arm64 support», you add one line to the platforms array instead of duplicating the entire CI job.
- Matrix builds or Docker Build Cloud: Bake is non-negotiable. No shell script cleanly handles the combinatorics of
platforms × modes × environmentsacross distributed builds. If you are paying for DBC minutes or running complex matrix builds, you are already in Bake territory.
If you are still maintaining a Docker build Makefile north of 100 lines, stop reading and migrate. The replacement docker-bake.hcl will be 20 lines, will survive code review, and will not break at 3 AM because someone changed the flag order. That trade — an afternoon of learning for years of not maintaining a build script — is the easiest infrastructure win most teams will get this year.
References
- Docker Bake: Now Generally Available — Docker Blog, February 5, 2025
- Farewell to Build Scripts as Docker Bake Goes GA — InfoQ, February 24, 2025
- Mastering multi-platform builds with Docker Buildx Bake — Docker Docs
- Docker Bake and Buildx: Declarative Multi-Platform Builds — TheCodeForge, July 2026
- AWS Graviton4 — General Availability, December 2024
- AmpereOne Family — Ampere Computing, 2025
- Stack Overflow Developer Survey 2025