Image Manifest Lists (Multi-Arch) in Docker
The registry object that lets one single image name and tag quietly point to a different binary for every CPU architecture it supports — and how that one indirection layer makes multi-platform Docker images possible at all.
Pull the exact same image name on an ARM-based laptop and on a traditional x86-64 cloud server, and both machines end up running perfectly, natively-compiled code — not through any magic emulation trick, but because the name you typed never actually pointed at one specific image in the first place. It pointed at a manifest list: a small, structured piece of registry metadata whose entire job is to say “here are several different images, each built for a different platform, and here is how to tell them apart.” This single indirection layer is the actual mechanism underneath every “multi-arch” or “multi-platform” Docker image you have ever pulled, and understanding exactly how it works turns what often feels like registry magic into a straightforward, inspectable piece of engineering. This guide walks through what a manifest list actually contains, how it is built, and how Docker uses it at pull time to make cross-platform distribution feel completely seamless.
Chapter One
ACore Concepts
Before looking at the file format itself, it helps to understand the layered structure a container registry actually stores, and where a manifest list fits within it.
The layered structure a registry actually stores
A container registry does not store one flat “image” object per name and tag. It stores several distinct layers of metadata: individual filesystem layers (the actual compressed data that makes up an image’s content), a manifest describing which layers make up one specific image for one specific platform, and — when an image supports more than one platform — a manifest list sitting above all of those individual manifests, tying them together under one shared, human-facing name and tag. A manifest list contains no actual application code or filesystem content of its own; it is pure metadata, a table of contents pointing at the real, platform-specific manifests underneath it.
Think of a manifest list like the index page of a multi-language instruction manual bundled with an appliance. The cover says simply “User Manual,” but flipping to the index reveals separate, complete instruction sets for English, Spanish, and French readers, each identical in purpose but written specifically for its audience. You don’t have to know which language section you need — the manual’s binding (the manifest list) already has the logic to hand you the right one automatically based on which country you bought it in, without you ever having to think about the other languages that exist inside the same physical book.
Why “multi-arch” is really just “multi-manifest, one list”
A common misconception is imagining a multi-architecture image as a single, unusual file that somehow contains code for several CPU architectures at once. In reality, each platform gets its own completely ordinary, single-platform image, built and stored exactly as any other image would be. The only thing that makes it “multi-arch” from the outside is the manifest list sitting above those ordinary images, listing each one alongside the specific platform it was built for. Nothing about an individual platform-specific image inside that list is special or different from an image published without any manifest list at all.
You may encounter this concept under two closely related names: Docker’s own “manifest list” format, and the “image index” format defined by the OCI (Open Container Initiative) image specification, which most modern tooling produces by default today. The two formats are functionally near-identical in purpose and structure — both are a list of platform-specific manifest references under one shared reference — so this guide uses “manifest list” as the general term for both.
What a manifest list actually records for each platform
For every platform-specific image it references, a manifest list records, at minimum, that image’s own manifest digest (a cryptographic fingerprint uniquely identifying its exact content), along with platform-descriptor fields specifying the target CPU architecture, the target operating system, and, where relevant, additional qualifiers like a specific CPU variant. This is the exact information a container runtime needs in order to correctly match its own host’s platform against the available entries in the list.
Chapter Two
BArchitecture & Components
A closer look at the specific pieces that make up a manifest list, and the tooling that creates and consumes it.
flowchart TB
TAG["myapp:latest
(shared name and tag)"]
ML["Manifest List / Image Index"]
M1["Manifest A
platform: linux/amd64"]
M2["Manifest B
platform: linux/arm64"]
M3["Manifest C
platform: linux/arm/v7"]
L1["Layers + Config (amd64 image)"]
L2["Layers + Config (arm64 image)"]
L3["Layers + Config (armv7 image)"]
TAG --> ML
ML --> M1 --> L1
ML --> M2 --> L2
ML --> M3 --> L3
Manifest List / Image Index
The top-level metadata object referenced by a name and tag when an image supports multiple platforms, containing an array of entries, each pointing to a single-platform manifest.
Platform-Specific Manifest
An ordinary image manifest, identical in format whether or not it happens to be referenced from a manifest list, describing the config and layer digests that make up one specific image build.
Content-Addressable Digest
Every manifest and layer is identified by a cryptographic hash of its own content, meaning the reference inside a manifest list is tamper-evident — any change to the referenced content would produce a different digest entirely.
Multi-Platform Builder (buildx and similar)
Modern build tooling capable of producing several platform-specific images from a single build invocation and automatically assembling and publishing the resulting manifest list to a registry in one step.
Platform-Aware Pull Logic
The logic inside the container runtime and CLI responsible for fetching a manifest list, comparing its entries against the local host’s detected platform, and pulling only the matching manifest and its layers.
Registry HTTP API
The standardized API container registries implement for storing and serving manifests, manifest lists, and layer blobs, which is what makes manifest lists portable across different registry implementations and vendors.
Where the manifest list sits in the pull request flow
When a client requests an image by name and tag, the registry’s response depends entirely on what was actually pushed under that reference: if a single-platform manifest was pushed, the registry returns that manifest directly; if a manifest list was pushed, the registry returns the list itself, and it becomes the client’s job to inspect that list, select the matching platform entry, and issue a second request for that specific manifest. This two-step resolution — list first, then the matching manifest — is precisely what allows one name to transparently serve many different platforms.
A detailed walk through exactly what happens, request by request, from the moment a pull command is issued to the moment the correct image lands on disk.
Step one: resolving the tag to content
When a pull is initiated, the client’s first request to the registry asks for whatever object is currently associated with the given name and tag. The registry responds with that object’s content type identified in the response — either an ordinary single-platform manifest, or a manifest list — along with the object’s own content. If it is a manifest list, the client now has, in hand, the complete set of platform options available under that tag, without having downloaded any actual application layers yet.
Step two: platform matching
With the manifest list in hand, the client compares its own host’s detected operating system and CPU architecture (and, where relevant, more specific qualifiers like a CPU variant) against each entry’s platform descriptor, looking for an exact or sufficiently compatible match. This comparison happens entirely client-side, using platform information the client already knows about its own host — the registry itself does not need to know anything about which specific machine is asking, since all the necessary platform options were already delivered in the manifest list response.
sequenceDiagram
participant C as Client (Docker CLI)
participant R as Registry
C->>R: GET manifest for myapp:latest
R-->>C: manifest list (all platform entries)
C->>C: detect local platform (e.g. linux/arm64)
C->>C: find matching entry in list
C->>R: GET manifest by digest (matched entry)
R-->>C: platform-specific manifest
C->>R: GET layer blobs by digest
R-->>C: layers (native arm64 content)
C->>C: assemble and run container natively
Step three: fetching only the matched content
Once the correct platform-specific manifest has been identified, the client issues a further request for that specific manifest by its digest, then downloads only the layer blobs referenced by that one manifest — never the layers belonging to any of the other, unmatched platform entries in the list. This is an important efficiency property worth being explicit about: pulling a multi-architecture image does not mean downloading every platform’s content and discarding what isn’t needed; only the genuinely relevant, matched platform’s data ever crosses the network to that particular host.
Digest immutability as the trust mechanism
Every reference inside a manifest list — from the list to each platform manifest, and from each manifest to its layers — is by content digest, a cryptographic hash of the referenced object’s exact bytes. This means a manifest list cannot silently or accidentally point to different content than what was originally published without that change being immediately, mathematically detectable, since even a single-byte difference in the referenced content produces a completely different digest.
Chapter Four
DData Flow & Lifecycle
Following a multi-architecture image from an initial build through to eventual consumption across a fleet of mixed-platform hosts.
Build Targets Defined
A build process is configured to target several platforms — commonly including both a widely used x86-64 variant and one or more ARM variants.
Per-Platform Images Built
Each targeted platform produces its own complete, independent image, built either natively on matching hardware or with the help of cross-platform build tooling.
Layers and Manifests Pushed
Each platform’s layers and its own manifest are pushed to the registry, each identified and stored by its own content digest.
Manifest List Assembled and Pushed
A manifest list is created referencing every platform’s manifest digest, and pushed to the registry under the shared, human-facing name and tag.
Fleet-Wide Pulls
Hosts across a mixed-architecture fleet pull the same tag, each automatically receiving only the manifest and layers matching its own detected platform.
Subsequent Updates
A later rebuild pushes new platform manifests and a new manifest list under the same tag, with the previous digests still retrievable directly for as long as the registry retains them, even after the tag itself has moved on.
What happens when a host’s platform has no matching entry
If a client’s detected platform does not correspond to any entry in the manifest list — for example, a host running an architecture the image was simply never built for — the pull fails with a clear “no matching manifest” style error, rather than silently falling back to an incompatible platform’s content or attempting any kind of automatic emulation on the client’s own initiative. This explicit failure is intentional: silently running the wrong platform’s binary would be far more dangerous than a clear, immediate failure that tells the operator exactly what platform support is missing.
Chapter Five
EAdvantages, Disadvantages & Trade-offs
Manifest lists solve a genuine problem elegantly, but adopting them fully is not entirely without cost.
Advantages
- A single, memorable image name and tag serves every supported platform, with no separate platform-suffixed tags for users to remember or choose between
- Clients download only the layers relevant to their own platform, never wasting bandwidth on unrelated architectures’ content
- Cryptographic digest references throughout make the entire structure tamper-evident and independently verifiable
- Deployment tooling and orchestration platforms require no special configuration to benefit — platform matching happens automatically and transparently
- Adding support for a new platform later is additive: publish a new platform manifest and update the list, without disturbing any existing platform’s content
Disadvantages
- Building and testing genuinely native images for every listed platform multiplies build pipeline time and complexity
- A manifest list is only as trustworthy as the build and publishing process that assembled it — an incomplete or misconfigured build can silently omit a platform
- Debugging “which exact image is actually running” requires an extra step of resolving the platform-specific manifest, rather than treating the tag itself as the whole story
- Registry tooling and older client versions that predate manifest list support may not fully understand or correctly resolve them
- Coordinating consistent behavior and version parity across several genuinely separate platform builds requires real ongoing discipline
The trade-off between one tag and platform-suffixed tags
Before manifest lists became standard, a common workaround for multi-platform distribution was publishing separate, platform-suffixed tags — one name for the x86-64 build, a differently named tag for the ARM build — and leaving it to the person deploying the image to manually select the correct one for their own hardware. Manifest lists remove that manual burden entirely, at the cost of an extra layer of indirection that makes “what am I actually running” a slightly less immediately obvious question than it was when the platform was spelled out directly in the tag name itself. For nearly all modern use cases, the convenience and correctness gained from automatic platform resolution outweighs that small loss of at-a-glance clarity, particularly since the underlying platform-specific manifest can still always be inspected explicitly when needed.
Even with a manifest list in play, tooling generally allows explicitly requesting a specific platform’s manifest directly, bypassing automatic matching entirely — useful for testing a non-native platform’s build on a development machine, or for deliberately pinning a deployment to one exact platform variant regardless of what the deploying host’s own architecture happens to be.
Chapter Six
FSecurity
Manifest lists interact with image supply chain security in specific, important ways, both strengthening and complicating parts of the trust picture.
Digest pinning as a supply-chain defense
Because every reference inside a manifest list is a cryptographic digest rather than a mutable name, pinning a deployment to a specific manifest list digest — rather than a floating tag like “latest” — provides a strong, verifiable guarantee that the exact same content, across every referenced platform, will be pulled every single time, immune to the tag being silently repointed at different content later. This makes manifest list digests a genuinely valuable tool for supply-chain-conscious deployments that want reproducible, auditable image references rather than a mutable name that could theoretically resolve to different content at different times.
A floating tag like “latest” is like referring to “the current mayor” — the specific person that phrase refers to can change over time even though the phrase itself never does. A digest reference is like referring to a specific person by their exact, unique fingerprint — it can only ever refer to that one, precise individual, regardless of who later becomes mayor. Pinning deployments to manifest list digests trades the convenience of a memorable, evolving name for the certainty of an unambiguous, unforgeable reference.
Ensuring every referenced platform is equally trustworthy
A manifest list is only as secure as its least-scrutinized entry: if an organization’s security scanning and signing process is rigorously applied to one platform’s build but only loosely applied to another platform included in the same manifest list, the overall image carries a real, if easy-to-overlook, inconsistency in its security posture depending purely on which platform a given host happens to pull. Comprehensive image security practices — vulnerability scanning, signing, provenance attestation — need to be applied uniformly across every platform entry in a manifest list, not just the platform a security team happens to test most often.
Context
A production incident traced back to a “latest”-tagged multi-architecture image resolving to unexpectedly different content than what had been tested, because the tag had been quietly repointed by a later build shortly before a deployment occurred.
Decision
Production deployment manifests were updated to reference images by their exact manifest list digest rather than a mutable tag, with the mutable tag retained only for convenience during local development and initial testing.
Consequence
Deployments became fully reproducible and immune to tag-repointing surprises, at the cost of requiring an explicit, deliberate update to the pinned digest whenever a genuinely new image version needed to be rolled out.
Chapter Seven
GMonitoring, Logging & Metrics
Verifying that a manifest list genuinely covers what it should, and diagnosing pull-time platform-matching failures, requires inspecting the right layer of metadata.
Confirming a manifest list’s actual platform coverage
The most fundamental verification step for any published multi-architecture image is directly inspecting its manifest list to confirm every intended platform is genuinely present with a valid, resolvable digest, rather than assuming coverage based purely on the build pipeline’s reported success. A build step that appears to succeed can still, due to a misconfiguration, omit a platform from the final published list, and this class of gap is only reliably caught by explicitly checking the published list’s actual contents, not by trusting the build log alone.
| Verification Step | What It Confirms | Why It Matters |
|---|---|---|
| Inspect the published manifest list | Every intended platform is present with a valid digest | Catches silent omissions the build log alone might not surface |
| Resolve each platform digest individually | Every referenced manifest actually exists and is retrievable | Catches a manifest list referencing content that was never fully pushed |
| Test a pull from each target platform | Client-side platform matching genuinely selects the right entry | Catches platform descriptor mismatches (e.g. missing CPU variant) |
| Compare digests across environments | Staging and production are running the identical content | Catches drift from an unintentional tag repoint |
Diagnosing a “no matching manifest” pull failure
When a pull fails with an error indicating no compatible manifest was found, the most productive first step is inspecting the manifest list’s actual platform entries directly and comparing them against the pulling host’s own detected platform string, since the mismatch is very often a narrower, more specific gap than it first appears — a missing CPU variant qualifier, for instance, rather than an entirely absent architecture. Treating this class of error as purely “the image doesn’t support my platform” without checking the exact entries can obscure a much smaller, more easily fixed gap in the published list.
A locally cached image pulled before a manifest list was updated to include a new platform can make it appear as though that platform still isn’t supported, even after the registry has genuinely been updated — clearing or bypassing the local cache is a useful troubleshooting step before concluding a platform is genuinely missing from the published list.
Chapter Eight
HDesign Patterns & Anti-patterns
Recurring, well-established approaches for managing manifest lists at scale, alongside the mistakes that quietly erode their benefits.
Single Build Invocation, Multiple Targets
Using build tooling that produces and publishes every targeted platform’s image and the resulting manifest list from one coordinated invocation, avoiding the drift risk of manually building and pushing each platform separately over time.
Digest-Pinned Production References
Referencing images in production deployment configuration by their exact manifest list digest rather than a mutable tag, trading a small amount of convenience for fully reproducible, auditable deployments.
Explicit Platform Verification in CI
Adding an automated check to the build pipeline that inspects the published manifest list and confirms every required platform is present before considering a release complete.
Manually Pushing Platform Images Separately Over Time
Building and pushing each platform’s image independently, at different times, without coordinated tooling assembling a single, consistent manifest list — a process highly prone to platforms silently falling out of sync with each other.
Trusting Build Success Without Verifying Published Coverage
Treating a green build pipeline as sufficient proof that a manifest list genuinely covers every intended platform, without an explicit post-publish verification step.
Pattern in practice: gradual platform rollout
Some teams deliberately introduce a new platform to an existing manifest list gradually — publishing and validating the new platform’s manifest thoroughly before it is included in the primary, widely-used tag’s manifest list — allowing early testing on the new platform without risking an unvetted build being automatically served to every host that happens to match it once it appears in the main list.
Chapter Nine
IBest Practices & Common Mistakes
Concrete guidance for publishing and consuming manifest lists reliably, across teams and over time.
Verify published platform coverage explicitly
After every publish, directly inspect the manifest list’s actual entries rather than relying solely on the build pipeline’s reported success as proof of complete platform coverage.
Pin production references to a specific digest
Use the manifest list’s exact digest for production deployment configuration where reproducibility matters, reserving mutable tags for development and initial testing convenience.
Apply security scanning uniformly across every listed platform
Ensure vulnerability scanning, signing, and provenance checks cover every platform entry in a manifest list equally, not just the platform used most often in day-to-day development.
Assembling manifest lists by hand from separately built images
Manually stitching together a manifest list from images built and pushed independently over time, rather than using coordinated tooling designed to keep every platform in sync from a single build invocation.
Ignoring stale local caches during troubleshooting
Concluding a platform is missing from a manifest list without first ruling out a stale, locally cached copy predating the actual registry update.
Treating platform-suffixed tags and manifest lists as interchangeable
Mixing legacy platform-suffixed tag conventions with manifest-list-based distribution inconsistently across an image catalog, confusing downstream users about which naming convention to actually rely on.
Chapter Ten
JReal-World & Industry Examples
Manifest lists are the invisible mechanism behind an enormous share of everyday container image pulls across the industry.
Official and Popular Base Images
Widely used official and community base images are almost universally published as manifest lists today, letting the same familiar image name serve developers and production hosts across a genuinely wide range of CPU architectures.
Cross-Platform Release Pipelines
Modern continuous-delivery pipelines commonly include a dedicated multi-platform build and publish stage specifically responsible for assembling and pushing a complete manifest list as part of every release.
Kubernetes Mixed-Node-Pool Clusters
Kubernetes clusters running mixed-architecture node pools rely entirely on manifest lists to schedule pods correctly, since the same pod specification and image reference can land on either architecture’s nodes and still resolve to the correct native image automatically.
Local Development on ARM Laptops
The everyday experience of pulling and running familiar development images on a modern ARM-based laptop, identically to how it worked on a traditional x86-64 machine, is made possible entirely by those images being published as manifest lists.
Chapter Eleven
KFrequently Asked Questions
Chapter Twelve
LSummary and Key Takeaways
A manifest list is a small, elegant piece of indirection that quietly does an enormous amount of work behind every modern multi-platform Docker image pull.
Key Takeaways
- A manifest list is pure metadata referencing several ordinary, platform-specific manifests under one shared image name and tag, containing no application content of its own.
- Pulling a multi-architecture image is a two-step process: fetch the manifest list, then fetch only the one platform-specific manifest and its layers that match the host’s detected platform.
- Every reference throughout the structure — list to manifest, manifest to layers — is a cryptographic content digest, making the whole system tamper-evident and independently verifiable.
- Pinning production deployments to a specific manifest list digest, rather than a mutable tag, provides strong reproducibility guarantees against unexpected content changes over time.
- A manifest list’s security posture is only as strong as its least-scrutinized platform entry, making uniform scanning and signing across every listed platform an essential practice, not an optional one.
- This mechanism is the invisible foundation behind the now-routine experience of pulling the same image name across genuinely different CPU architectures — from ARM laptops to traditional cloud servers — and having it simply, correctly work.