{"record":{"id":"02f489a09f6a60f1","repo":"docker/cli","slug":"s-is-not-a-manifest","errorCode":null,"errorMessage":"%s is not a manifest","messagePattern":"(.+?) is not a manifest","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/registryclient/fetcher.go","lineNumber":41,"sourceCode":"\n// fetchManifest pulls a manifest from a registry and returns it. An error\n// is returned if no manifest is found matching namedRef.\nfunc fetchManifest(ctx context.Context, repo distribution.Repository, ref reference.Named) (types.ImageManifest, error) {\n\tmanifest, err := getManifest(ctx, repo, ref)\n\tif err != nil {\n\t\treturn types.ImageManifest{}, err\n\t}\n\n\tswitch v := manifest.(type) {\n\t// Removed Schema 1 support\n\tcase *schema2.DeserializedManifest:\n\t\treturn pullManifestSchemaV2(ctx, ref, repo, *v)\n\tcase *ocischema.DeserializedManifest:\n\t\treturn pullManifestOCISchema(ctx, ref, repo, *v)\n\tcase *manifestlist.DeserializedManifestList:\n\t\treturn types.ImageManifest{}, fmt.Errorf(\"%s is a manifest list\", ref)\n\t}\n\treturn types.ImageManifest{}, fmt.Errorf(\"%s is not a manifest\", ref)\n}\n\nfunc fetchList(ctx context.Context, repo distribution.Repository, ref reference.Named) ([]types.ImageManifest, error) {\n\tmanifest, err := getManifest(ctx, repo, ref)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch v := manifest.(type) {\n\tcase *manifestlist.DeserializedManifestList:\n\t\treturn pullManifestList(ctx, ref, repo, *v)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported manifest format: %v\", v)\n\t}\n}\n\nfunc getManifest(ctx context.Context, repo distribution.Repository, ref reference.Named) (distribution.Manifest, error) {\n\tmanSvc, err := repo.Manifests(ctx)","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/internal/registryclient/fetcher.go#L23-L59","documentation":"The default branch of fetchManifest's type switch — the object returned by the registry is none of schema2 DeserializedManifest, OCI DeserializedManifest, or DeserializedManifestList. Schema 1 was explicitly removed, so this typically means an old or non-standard manifest media type the client no longer understands.","triggerScenarios":"A registry serves a v2 schema-1 manifest, an unknown media type, or a future/custom manifest type not handled by this version of docker/cli.","commonSituations":"Very old images pushed with deprecated schema 1; version skew between an older registry and a newer CLI that dropped schema 1; a custom registry serving non-standard manifests.","solutions":["Re-build and re-push the image so it is stored as schema2 or OCI.","Upgrade the registry to a current distribution release.","Inspect the manifest media type with crane / skopeo / docker manifest inspect to identify what is being served.","If you must read the old image, use a tool that still supports the legacy schema."],"exampleFix":"# old image served as schema 1 -> repush with current docker build/push\ndocker pull legacy/img:tag && docker tag legacy/img:tag myreg/img:tag && docker push myreg/img:tag","handlingStrategy":"validation","validationCode":"// Inspect the manifest media type before expecting fetchManifest to handle it.\nvar supportedSingle = map[string]bool{\n    \"application/vnd.docker.distribution.manifest.v2+json\":      true,\n    \"application/vnd.oci.image.manifest.v1+json\":                true,\n}\n// fetch the descriptor/media type via registry API, then check the map.","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep images on current schema2/OCI manifests; retire schema-1 artifacts.","Match registry and CLI versions to avoid unhandled media types.","Inspect media types with crane/skopeo before relying on them."],"tags":["docker","registry","manifest","compatibility"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}