{"record":{"id":"8526dec58a41272b","repo":"GoogleContainerTools/jib","slug":"expected-image-digest-expecteddigest-but-recei","errorCode":null,"errorMessage":"Expected image digest ${expectedDigest}, but received: ${receivedDigests}","messagePattern":"Expected image digest (.+?), but received: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"jib-core/src/main/java/com/google/cloud/tools/jib/registry/ManifestPusher.java","lineNumber":145,"sourceCode":"    // Checks if the image digest is as expected.\n    DescriptorDigest expectedDigest = Digests.computeJsonDigest(manifestTemplate);\n\n    List<String> receivedDigests = response.getHeader(RESPONSE_DIGEST_HEADER);\n    if (receivedDigests.size() == 1) {\n      try {\n        DescriptorDigest receivedDigest = DescriptorDigest.fromDigest(receivedDigests.get(0));\n        if (expectedDigest.equals(receivedDigest)) {\n          return expectedDigest;\n        }\n\n      } catch (DigestException ex) {\n        // Invalid digest.\n      }\n    }\n\n    // The received digest is not as expected. Warns about this.\n    eventHandlers.dispatch(\n        LogEvent.warn(makeUnexpectedImageDigestWarning(expectedDigest, receivedDigests)));\n    return expectedDigest;\n  }\n\n  @Override\n  public URL getApiRoute(String apiRouteBase) throws MalformedURLException {\n    return new URL(\n        apiRouteBase + registryEndpointRequestProperties.getImageName() + \"/manifests/\" + imageTag);\n  }\n\n  @Override\n  public String getHttpMethod() {\n    return HttpMethods.PUT;\n  }\n\n  @Override\n  public String getActionDescription() {\n    return \"push image manifest for \"\n        + registryEndpointRequestProperties.getServerUrl()","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/GoogleContainerTools/jib/blob/fb949e2676afbbd7dd7a1ef61e20251931325654/jib-core/src/main/java/com/google/cloud/tools/jib/registry/ManifestPusher.java#L127-L163","documentation":"ManifestPusher logs this warning when the digest returned by the registry after pushing an image manifest does not match the digest Jib computed for the manifest it sent. Jib still returns the expected digest but warns that the registry's reported digest(s) differ, which can indicate a registry bug or a proxy altering content.","triggerScenarios":"docker push-style manifest PUT completes with HTTP 201, but the Docker-Content-Digest response header (or digest computed from the response body) differs from the sha256 digest Jib computed locally; handled in handleResponse of ManifestPusher.","commonSituations":"Registries or reverse proxies that modify/normalize manifests; misconfigured registries returning wrong Docker-Content-Digest headers; signed/rewritten manifests by admission proxies; image references resolving to a registry that transforms manifests.","solutions":["Verify the pushed image by pulling it by digest and checking `docker inspect` / `crane digest`","Check for proxies or registry middleware that rewrite manifests and bypass/fix them","Update the registry software; known old registries mishandle Docker-Content-Digest headers","If the mismatch is benign for your setup, note that the warning is informational — Jib uses its locally computed digest"],"exampleFix":"// before: silent confusion over digest mismatch\ncrane digest registry.example.com/app@sha256:...\n// after: confirm with the registry what was actually stored\ncrane manifest registry.example.com/app:tag | sha256sum","handlingStrategy":"validation","validationCode":"// confirm stored digest matches after push\ncrane digest registry.example.com/app@sha256:<expected> || echo \"digest mismatch on registry\"","typeGuard":null,"tryCatchPattern":"try {\n  ImageDigest pushed = jibPush();\n  if (!pushed.getDigest().equals(expectedDigest)) {\n    log.warn(\"registry returned a different digest; verify what was stored\");\n  }\n} catch (RegistryException e) { /* handle registry errors */ }","preventionTips":["Verify images by digest after push (crane/docker inspect)","Audit proxies/middleware that could rewrite manifests between client and registry","Keep registry software current — old registries mishandle Docker-Content-Digest"],"tags":["digest","registry","push","integrity"],"backgroundTag":"checksum-mismatch","analyzedSha":"fb949e2676afbbd7dd7a1ef61e20251931325654","analyzedAt":"2026-09-06T14:04:09.491Z","contentChangedAt":"2026-09-06T14:04:09.491Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}