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.
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)
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: <layerFile>
- Manifest cache empty
- Manifest(s) missing
- Schema 1 manifests corrupted
- Cannot run Jib in offline mode; <imageReference> not found i
AI-assisted analysis of GoogleContainerTools/jib@fb949e2676 (2026-09-06).
Data as JSON: /api/errors/60aa48d5ffd0d245.
Report an issue: GitHub.