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

  1. Clear the Jib cache directory for that base image (or the whole cache) and rebuild online
  2. Run the build once with network access so the manifest list and platform manifests are re-fetched together
  3. If you intended a single-platform base image, use a digest or tag that points directly at a single manifest rather than a list
  4. 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

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


AI-assisted analysis of GoogleContainerTools/jib@fb949e2676 (2026-09-06). Data as JSON: /api/errors/60aa48d5ffd0d245. Report an issue: GitHub.