docker/cli · error

unsupported manifest type: %T

Error message

unsupported manifest type: %T

What it means

In pullManifestList each child entry of a manifest list is expected to be a schema2 or OCI manifest. If a child is any other type (legacy schema 1, a nested list, or an unknown media type), this fires and embeds the Go type name via %T so you can see exactly what was unexpected.

Solutions

  1. Rebuild the manifest list with current schema2/OCI children (`docker manifest create`).
  2. Inspect the list with `docker manifest inspect <ref>` to see each child's media type.
  3. Upgrade the CLI/registry to matching current versions.
  4. If a specific platform child is fine, pull that child digest directly with GetManifest.

Example fix

# rebuild the manifest list with current images
docker manifest create myreg/img:multi myreg/img:amd64 myreg/img:arm64
docker manifest push myreg/img:multi
Defensive patterns

Strategy: validation

Validate before calling

// Inspect each child's media type before iterating a manifest list.
var okChild = map[string]bool{
    "application/vnd.docker.distribution.manifest.v2+json": true,
    "application/vnd.oci.image.manifest.v1+json":           true,
}
// read child descriptors and reject lists containing unsupported media types up front.

Prevention

When it happens

Trigger: A manifest list whose child descriptors resolve to a type other than schema2 / OCI DeserializedManifest — e.g. an old multi-arch image containing schema-1 children, or a malformed/nested index.

Common situations: Legacy multi-arch images built with deprecated tooling; registry/custom manifest formats; version skew where a newer registry emits a manifest subtype this CLI does not handle.

Related errors


AI-assisted analysis of docker/cli@4f84911bfe (2026-08-07). Data as JSON: /api/errors/5ba3a12f911d6e14. Report an issue: GitHub.

Appendix: source

Thrown at internal/registryclient/fetcher.go:183

		}
		manifest, err := manSvc.Get(ctx, manifestDescriptor.Digest)
		if err != nil {
			return nil, err
		}

		manifestRef, err := reference.WithDigest(ref, manifestDescriptor.Digest)
		if err != nil {
			return nil, err
		}

		var imageManifest types.ImageManifest
		switch v := manifest.(type) {
		case *schema2.DeserializedManifest:
			imageManifest, err = pullManifestSchemaV2(ctx, manifestRef, repo, *v)
		case *ocischema.DeserializedManifest:
			imageManifest, err = pullManifestOCISchema(ctx, manifestRef, repo, *v)
		default:
			err = fmt.Errorf("unsupported manifest type: %T", manifest)
		}
		if err != nil {
			return nil, err
		}

		// Replace platform from config
		p := manifestDescriptor.Platform
		imageManifest.Descriptor.Platform = types.OCIPlatform(&p)

		infos = append(infos, imageManifest)
	}
	return infos, nil
}

func continueOnError(err error) bool {
	switch v := err.(type) {
	case errcode.Errors:
		if len(v) == 0 {

View on GitHub (pinned to 4f84911bfe)