GoogleContainerTools/jib · error · UnknownManifestFormatException
Invalid container configuration in Docker V2.2/OCI manifest:
Error message
Invalid container configuration in Docker V2.2/OCI manifest: <manifest JSON>
What it means
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.
Source
Thrown at jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/PullBaseImageStep.java:406
* @param registryClient to communicate with remote registry
* @param progressDispatcherFactory the {@link ProgressEventDispatcher.Factory} for emitting
* {@link ProgressEvent}s
* @return pulled {@link ContainerConfigurationTemplate}
* @throws IOException when an I/O exception occurs during the pulling
* @throws LayerPropertyNotFoundException if adding image layers fails
*/
private ContainerConfigurationTemplate pullContainerConfigJson(
ManifestAndDigest<?> manifestAndDigest,
RegistryClient registryClient,
ProgressEventDispatcher.Factory progressDispatcherFactory)
throws IOException, LayerPropertyNotFoundException, UnknownManifestFormatException {
BuildableManifestTemplate manifest =
(BuildableManifestTemplate) manifestAndDigest.getManifest();
Preconditions.checkArgument(manifest.getSchemaVersion() == 2);
if (manifest.getContainerConfiguration() == null
|| manifest.getContainerConfiguration().getDigest() == null) {
throw new UnknownManifestFormatException(
"Invalid container configuration in Docker V2.2/OCI manifest: \n"
+ JsonTemplateMapper.toUtf8String(manifest));
}
try (ThrottledProgressEventDispatcherWrapper progressDispatcherWrapper =
new ThrottledProgressEventDispatcherWrapper(
progressDispatcherFactory,
"pull container configuration " + manifest.getContainerConfiguration().getDigest())) {
String containerConfigString =
Blobs.writeToString(
registryClient.pullBlob(
manifest.getContainerConfiguration().getDigest(),
progressDispatcherWrapper::setProgressTarget,
progressDispatcherWrapper::dispatchProgress));
return JsonTemplateMapper.readJson(
containerConfigString, ContainerConfigurationTemplate.class);
}View on GitHub (pinned to fb949e2676)
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
Example fix
// before (build.gradle)
from { image = 'my-mirror.internal/jdk:8' } // mirror serves broken manifest
// after
from { image = 'openjdk:8' } // upstream registry, valid manifest Defensive patterns
Strategy: try-catch
Validate before calling
crane manifest $BASE_IMAGE | jq -e '.config.digest'
Prevention
- Avoid manifest-rewriting proxies
- Use conformant registries
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Dependency required by the JAR (as specified in `Class-Path`
- `Main-Class:` attribute for an application main class not de
- `Main-Class:` attribute for an application main class not de
- Cannot build to a container registry in offline mode
- Manifest(s) missing
AI-assisted analysis of GoogleContainerTools/jib@fb949e2676 (2026-09-06).
Data as JSON: /api/errors/6e334408cb966c7f.
Report an issue: GitHub.