lima-vm/lima · error

invalid digest in raw digest file

Error message

invalid digest in raw digest file %q: %w

What it means

When resolving a cached converted (raw) image, getCached reads the sidecar raw digest file and parses it with digest.Parse. If the stored digest string is malformed (e.g. missing "sha256:" prefix or non-hex characters), the parse failure is wrapped in this error and the cache resolution aborts.

Solutions

  1. Delete the corrupted digest file (and its associated raw image) from the cache directory and re-run the download so it is regenerated.
  2. Ensure the digest file contains a valid form like "sha256:<64 hex chars>" if you maintain the cache manually.
  3. Clear the whole cache dir if multiple entries look corrupt.

Example fix

// before: cache contains 'abc123' (no algo prefix) -> invalid digest
// after: fix the cache entry
$ echo "sha256:<64-hex>" > ~/.cache/lima/images/<img>-raw.digest
// or simply:
$ rm ~/.cache/lima/images/<img>-raw.digest  # forces regeneration
Defensive patterns

Strategy: validation

Validate before calling

data, err := os.ReadFile(digestPath)
if err == nil {
    if _, err := digest.Parse(strings.TrimSpace(string(data))); err != nil {
        os.Remove(digestPath) // purge corrupt cache entry before downloading
    }
}

Type guard

func isValidDigest(s string) bool {
    _, err := digest.Parse(strings.TrimSpace(s))
    return err == nil
}

Try / catch

res, err := d.Download(ctx, "", url)
if err != nil && strings.Contains(err.Error(), "invalid digest in raw digest file") {
    os.Remove(corruptDigestPath); res, err = d.Download(ctx, "", url) // retry after purge
}

Prevention

When it happens

Trigger: A raw-image conversion digest file (rawImgConvDigestPath, e.g. <image>.digest under the imgConv cache dir) exists in the cache but its trimmed content is not a valid containerd-style digest, encountered during a cache-only Download.

Common situations: Cache files hand-edited or truncated by disk-full during a previous run; a cache written by an older Lima version with a different digest format; copying cache directories between machines with corruption.

Related errors


AI-assisted analysis of lima-vm/lima@dd909d0973 (2026-09-01). Data as JSON: /api/errors/da9d96cd8091f88b. Report an issue: GitHub.

Appendix: source

Thrown at pkg/downloader/downloader.go:360

					converted, rawDigest, err := ensureRawInCache(ctx, shadData, imageFormat, o.expectedDigest)
					if err != nil {
						return nil, err
					}
					shadData = converted
					if o.expectedDigest != "" {
						o.expectedDigest = rawDigest
						shadDigest = rawImgConvDigestPath
					}
				} else {
					shadData = rawImgConvPath
					if o.expectedDigest != "" {
						if currentDigestData, err := os.ReadFile(rawImgConvDigestPath); err == nil {
							currentDigest := strings.TrimSpace(string(currentDigestData))
							if d, err := digest.Parse(currentDigest); err == nil {
								o.expectedDigest = d
								shadDigest = rawImgConvDigestPath
							} else {
								return nil, fmt.Errorf("invalid digest in raw digest file %q: %w", rawImgConvDigestPath, err)
							}
						} else {
							return nil, fmt.Errorf("failed to read raw digest file %q: %w", rawImgConvDigestPath, err)
						}
					}
				}
			}
		}
	}

	ext := path.Ext(remote)
	logrus.Debugf("file %#q is cached as %#q", localPath, shadData)
	if _, err := os.Stat(shadDigest); err == nil {
		logrus.Debugf("Comparing digest %#q with the cached digest file %#q, not computing the actual digest of %#q",
			o.expectedDigest, shadDigest, shadData)
		if err := validateCachedDigest(shadDigest, o.expectedDigest); err != nil {
			return nil, err
		}

View on GitHub (pinned to dd909d0973)