Image Manifest Lists (Multi-Arch) in Docker

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.

Everyday Analogy

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.

i
Two Related Formats, One Idea

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.

1
SHARED NAME AND TAG
Many
PLATFORM-SPECIFIC MANIFESTS REFERENCED
0
DUPLICATED APPLICATION CODE ACROSS THEM

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
Fig. 1 — One shared tag resolves to a manifest list, which points to a completely separate, ordinary manifest and image for each platform
Registry Object

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.

Registry Object

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.

Identity Mechanism

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.

Build Tooling

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.

Client Behavior

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.

Distribution API

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
    
Fig. 2 — Two distinct registry round-trips: one to discover available platforms, one to fetch the matched platform’s actual content

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.

1

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.

2

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.

3

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.

4

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.

5

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.

6

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.

“A manifest list doesn’t make one image work everywhere — it makes many ordinary, platform-specific images answer to the same name.”

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.

i
You Can Still Pin a Specific Platform

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.

Security Analogy

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.

ADR-088: Digest-Pinned Deployments for Production ManifestsAdopted
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 StepWhat It ConfirmsWhy It Matters
Inspect the published manifest listEvery intended platform is present with a valid digestCatches silent omissions the build log alone might not surface
Resolve each platform digest individuallyEvery referenced manifest actually exists and is retrievableCatches a manifest list referencing content that was never fully pushed
Test a pull from each target platformClient-side platform matching genuinely selects the right entryCatches platform descriptor mismatches (e.g. missing CPU variant)
Compare digests across environmentsStaging and production are running the identical contentCatches 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.

!
Stale Cache Confusion

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.

Pattern

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.

Pattern

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.

Pattern

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.

Anti-pattern

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.

Anti-pattern

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.

Concrete guidance for publishing and consuming manifest lists reliably, across teams and over time.

Do

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.

Do

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.

Do

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.

Avoid

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.

Avoid

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.

Avoid

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.

Checklist Before considering a multi-architecture image release complete, confirm: (1) the published manifest list contains every intended platform with a resolvable digest, (2) security scanning and signing have been applied to every listed platform, (3) production deployment configuration references the specific digest rather than a mutable tag where reproducibility matters, and (4) a test pull from each target platform genuinely resolves to native, correctly matched content.

Chapter Ten

JReal-World & Industry Examples

Manifest lists are the invisible mechanism behind an enormous share of everyday container image pulls across the industry.

Public Registries

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.

CI/CD Platforms

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.

Orchestration

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.

Developer Tooling

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.

Default
FOR MOST MODERN PUBLIC BASE IMAGES
2
REGISTRY ROUND-TRIPS PER PULL (LIST, THEN MANIFEST)
1
NAME SERVING EVERY SUPPORTED PLATFORM

Chapter Eleven

KFrequently Asked Questions

Q1Does a manifest list contain the actual application code and layers itself?
No. A manifest list is pure metadata — a list of references pointing to separate, ordinary platform-specific manifests, each of which in turn references the actual layer content for that one platform.
Q2Do I need to specify which platform I want when pulling a multi-architecture image?
Generally no. The client automatically detects the host’s platform and selects the matching entry from the manifest list; explicit platform selection is only needed to override that default, such as pulling a non-native platform deliberately.
Q3Does pulling a multi-architecture image download every platform’s content?
No. Only the manifest list itself and the single, matched platform’s manifest and layers are downloaded; every other platform’s content referenced in the same list is left untouched on the registry.
Q4What happens if my host’s platform isn’t in the manifest list at all?
The pull fails with an explicit “no matching manifest” style error rather than silently substituting an incompatible platform’s content, making the gap immediately visible rather than causing a confusing downstream failure.
Q5Is a manifest list the same thing as an OCI image index?
They are functionally very similar, serving the same purpose of listing platform-specific manifests under one shared reference; the OCI image index is the vendor-neutral specification version, and most current tooling produces it by default.
Q6Can I reference one specific platform’s image directly, bypassing the manifest list?
Yes. The underlying platform-specific manifest can generally be referenced directly by its own digest, letting you pin to one exact platform’s content regardless of the pulling host’s own detected architecture.

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.