GoogleContainerTools/jib · error · CacheCorruptedException
Manifest list missing
Error message
Manifest list missing
What it means
For schema 2 images stored with a manifest list (multi-arch base images), verifyImageMetadata expects the metadata to include a manifest list and exactly one platform-specific manifest per entry. If the manifestList field is null while the entry count doesn't equal 1, the cached metadata is incomplete and CacheCorruptedException('Manifest list missing') is thrown.
Solutions
- Clear the Jib cache directory for that base image (or the whole cache) and rebuild online
- Run the build once with network access so the manifest list and platform manifests are re-fetched together
- If you intended a single-platform base image, use a digest or tag that points directly at a single manifest rather than a list
- Check for concurrent builds racing on the same cache directory; give each build its own cache
Example fix
// before mvn jib:build -Djib.offline=true // metadata missing manifest list // after rm -rf ~/.cache/google-cloud-tools-jib mvn jib:build // online rebuild stores complete manifest-list metadata
Defensive patterns
Strategy: retry
Validate before calling
jq -e '.manifestList != null' "$METADATA_FILE" || rm -rf "$IMG_CACHE_DIR"
Prevention
- Avoid concurrent builds sharing one cache
When it happens
Trigger: retrieveMetadata loads metadata cached for a manifest-list base image where getManifestList() is null and manifestsAndConfigs.size() != 1 — i.e., the index entry was lost or multiple per-platform manifests were cached without their parent list.
Common situations: Partial write of multi-arch base image metadata from an interrupted pull; switching the base image between a single-manifest tag and a manifest-list tag with a stale cache; cache corruption on shared CI storage.
Related errors
- Layer file did not include valid hash
- Manifest cache empty
- Manifest(s) missing
- Schema 1 manifests corrupted
- CacheDirectoryCreationException wrapping IOException from…
AI-assisted analysis of GoogleContainerTools/jib@fb949e2676 (2026-09-06).
Data as JSON: /api/errors/60aa48d5ffd0d245.
Report an issue: GitHub.
Appendix: source
Thrown at jib-core/src/main/java/com/google/cloud/tools/jib/cache/CacheStorageReader.java:55
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** Reads from the default cache storage engine. */
class CacheStorageReader {
@VisibleForTesting
static void verifyImageMetadata(ImageMetadataTemplate metadata, Path metadataCacheDirectory)
throws CacheCorruptedException {
List<ManifestAndConfigTemplate> manifestsAndConfigs = metadata.getManifestsAndConfigs();
if (manifestsAndConfigs.isEmpty()) {
throw new CacheCorruptedException(metadataCacheDirectory, "Manifest cache empty");
}
if (manifestsAndConfigs.stream().anyMatch(entry -> entry.getManifest() == null)) {
throw new CacheCorruptedException(metadataCacheDirectory, "Manifest(s) missing");
}
if (metadata.getManifestList() == null && manifestsAndConfigs.size() != 1) {
throw new CacheCorruptedException(metadataCacheDirectory, "Manifest list missing");
}
ManifestTemplate firstManifest = manifestsAndConfigs.get(0).getManifest();
if (firstManifest instanceof V21ManifestTemplate) {
if (metadata.getManifestList() != null
|| manifestsAndConfigs.stream().anyMatch(entry -> entry.getConfig() != null)) {
throw new CacheCorruptedException(metadataCacheDirectory, "Schema 1 manifests corrupted");
}
} else if (firstManifest instanceof BuildableManifestTemplate) {
if (manifestsAndConfigs.stream().anyMatch(entry -> entry.getConfig() == null)) {
throw new CacheCorruptedException(metadataCacheDirectory, "Schema 2 manifests corrupted");
}
if (metadata.getManifestList() != null
&& manifestsAndConfigs.stream().anyMatch(entry -> entry.getManifestDigest() == null)) {
throw new CacheCorruptedException(metadataCacheDirectory, "Schema 2 manifests corrupted");
}
} else {
throw new CacheCorruptedException(View on GitHub (pinned to fb949e2676)