{"record":{"id":"13f53200bf2b587b","repo":"amir20/dozzle","slug":"image-not-found-in-registry","errorCode":null,"errorMessage":"image not found in registry","messagePattern":"image not found in registry","errorType":"error_code","errorClass":"ErrNotFound","httpStatus":null,"severity":"warning","filePath":"internal/imagecheck/registry.go","lineNumber":33,"sourceCode":")\n\n// acceptManifests lists every manifest media type we are willing to receive.\n// Multi-arch images resolve to an index/manifest-list, which is the digest\n// recorded in the local RepoDigests, so those come first.\nvar acceptManifests = strings.Join([]string{\n\t\"application/vnd.oci.image.index.v1+json\",\n\t\"application/vnd.docker.distribution.manifest.list.v2+json\",\n\t\"application/vnd.docker.distribution.manifest.v2+json\",\n\t\"application/vnd.oci.image.manifest.v1+json\",\n}, \",\")\n\nvar (\n\t// ErrAuthRequired means the registry rejected an anonymous request. Dozzle\n\t// has no credential store, so private images are reported rather than\n\t// retried.\n\tErrAuthRequired = errors.New(\"registry requires authentication\")\n\t// ErrNotFound means the tag no longer exists upstream.\n\tErrNotFound = errors.New(\"image not found in registry\")\n\t// ErrRateLimited means the registry asked us to back off.\n\tErrRateLimited = errors.New(\"registry rate limited the request\")\n)\n\ntype cachedToken struct {\n\ttoken     string\n\texpiresAt time.Time\n}\n\n// Registry resolves the current manifest digest for an image reference using\n// HEAD requests, which registries do not count against image pull rate limits.\ntype Registry struct {\n\tclient *http.Client\n\n\tmu     sync.Mutex\n\ttokens map[string]cachedToken\n}\n","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/amir20/dozzle/blob/d9463cbe21874e44ab79db6fa63e746ca7d22928/internal/imagecheck/registry.go#L15-L51","documentation":"ErrNotFound means the tag or digest being checked no longer exists upstream: the registry returned HTTP 404 for the manifest request. The image check cannot compute a remote digest because there is nothing at that reference anymore.","triggerScenarios":"Digest performs a manifest request and receives http.StatusNotFound (registry.go:107); typically the watched tag was deleted, retagged, or the image name is misspelled.","commonSituations":"A :latest-style mutable tag was removed upstream; a maintained image stopped publishing a specific version tag; typo in the image repository name in compose files; images pruned from a self-hosted registry.","solutions":["Run docker manifest inspect <image:tag> to confirm the tag really is gone upstream.","If the tag was deleted, pin the check to a tag that exists (or the local digest) instead.","Check the image name spelling and registry host (e.g. library/ prefix on Docker Hub, ghcr.io owner/repo).","If you run the registry, check retention/pruning policies that may be deleting tags."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"docker manifest inspect <image:tag> >/dev/null 2>&1 && echo 'tag exists' || echo 'tag missing upstream'","typeGuard":"func isNotFound(err error) bool { return errors.Is(err, imagecheck.ErrNotFound) }","tryCatchPattern":null,"preventionTips":["Pin update checks to tags known to exist","Verify image names/tags with docker manifest inspect before adding them","Watch for registry pruning policies that delete old tags","Correct repository spelling incl. registry host and namespace prefixes"],"tags":["docker","registry","not-found","update-check"],"backgroundTag":"resource-not-found","analyzedSha":"d9463cbe21874e44ab79db6fa63e746ca7d22928","analyzedAt":"2026-09-07T10:08:55.855Z","contentChangedAt":"2026-09-07T10:08:55.855Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}