{"record":{"id":"6e334408cb966c7f","repo":"GoogleContainerTools/jib","slug":"invalid-container-configuration-in-docker-v2-2-oci","errorCode":null,"errorMessage":"Invalid container configuration in Docker V2.2/OCI manifest: \n<manifest JSON>","messagePattern":"Invalid container configuration in Docker V2\\.2/OCI manifest: \n<manifest JSON>","errorType":"exception","errorClass":"UnknownManifestFormatException","httpStatus":null,"severity":"error","filePath":"jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/PullBaseImageStep.java","lineNumber":406,"sourceCode":"   * @param registryClient to communicate with remote registry\n   * @param progressDispatcherFactory the {@link ProgressEventDispatcher.Factory} for emitting\n   *     {@link ProgressEvent}s\n   * @return pulled {@link ContainerConfigurationTemplate}\n   * @throws IOException when an I/O exception occurs during the pulling\n   * @throws LayerPropertyNotFoundException if adding image layers fails\n   */\n  private ContainerConfigurationTemplate pullContainerConfigJson(\n      ManifestAndDigest<?> manifestAndDigest,\n      RegistryClient registryClient,\n      ProgressEventDispatcher.Factory progressDispatcherFactory)\n      throws IOException, LayerPropertyNotFoundException, UnknownManifestFormatException {\n    BuildableManifestTemplate manifest =\n        (BuildableManifestTemplate) manifestAndDigest.getManifest();\n    Preconditions.checkArgument(manifest.getSchemaVersion() == 2);\n\n    if (manifest.getContainerConfiguration() == null\n        || manifest.getContainerConfiguration().getDigest() == null) {\n      throw new UnknownManifestFormatException(\n          \"Invalid container configuration in Docker V2.2/OCI manifest: \\n\"\n              + JsonTemplateMapper.toUtf8String(manifest));\n    }\n\n    try (ThrottledProgressEventDispatcherWrapper progressDispatcherWrapper =\n        new ThrottledProgressEventDispatcherWrapper(\n            progressDispatcherFactory,\n            \"pull container configuration \" + manifest.getContainerConfiguration().getDigest())) {\n\n      String containerConfigString =\n          Blobs.writeToString(\n              registryClient.pullBlob(\n                  manifest.getContainerConfiguration().getDigest(),\n                  progressDispatcherWrapper::setProgressTarget,\n                  progressDispatcherWrapper::dispatchProgress));\n      return JsonTemplateMapper.readJson(\n          containerConfigString, ContainerConfigurationTemplate.class);\n    }","sourceCodeStart":388,"sourceCodeEnd":424,"githubUrl":"https://github.com/GoogleContainerTools/jib/blob/fb949e2676afbbd7dd7a1ef61e20251931325654/jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/PullBaseImageStep.java#L388-L424","documentation":"Jib pulled a Docker V2.2/OCI manifest for the base image, but the manifest's container configuration blob is missing or has no digest. Preconditions.checkArgument enforces schema version 2, and a schema-2 manifest must reference a config; its absence means the manifest is malformed, so UnknownManifestFormatException is thrown with the full manifest JSON.","triggerScenarios":"pullContainerConfigJson receives a manifest where getContainerConfiguration() is null or getContainerConfiguration().getDigest() is null; typically caused by a registry serving a non-standard or corrupted manifest for the base image reference.","commonSituations":"Pointing jib at a registry/proxy (mirror, Artifactory, Nexus) that rewrites or truncates manifests; using a base image pushed by a non-Docker/OCI-conformant tool; registry serving schema 1 or an unexpected media type despite the manifest claiming v2.2.","solutions":["Inspect the manifest served for the base image (docker manifest inspect / crane manifest) and confirm it has a valid config.digest","Check any registry mirror/proxy in the config (e.g. Docker Hub mirrors, Artifactory) and try pulling directly from the upstream registry","Re-push or fix the base image with a conformant tool (docker push, crane) so the manifest includes a container configuration","Use a different, well-known base image tag"],"exampleFix":"// before (build.gradle)\nfrom { image = 'my-mirror.internal/jdk:8' }  // mirror serves broken manifest\n// after\nfrom { image = 'openjdk:8' }                 // upstream registry, valid manifest","handlingStrategy":"try-catch","validationCode":"crane manifest $BASE_IMAGE | jq -e '.config.digest'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid manifest-rewriting proxies","Use conformant registries"],"tags":["manifest","oci","registry","corrupt-manifest","jib"],"backgroundTag":"unexpected-response-shape","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"}