dagger/dagger · error

failed to get mounts of %q

Error message

failed to get mounts of %q

What it means

Merge wraps failures from sn.Mounts(ctx, prepareKey) with "failed to get mounts of %q". After successfully preparing an intermediate snapshot, the code asks the snapshotter for its mount configuration to apply the diffs onto; if the snapshotter cannot compute mounts (snapshot vanished, backend error), this error is returned. The %q is the destination key, not the internal prepareKey.

Source

Thrown at engine/snapshots/merge.go:122

		}
		ctx = leaseCtx
	}
	if leaseID, ok := leases.FromContext(ctx); !ok || leaseID == "" {
		leaseCtx, done, err := WithLease(ctx, sn.lm, MakeTemporary)
		if err != nil {
			return errors.Wrap(err, "failed to create temporary lease for view mounts during merge")
		}
		defer done(context.TODO())
		ctx = leaseCtx
	}

	prepareKey := identity.NewID()
	if err := sn.Prepare(ctx, prepareKey, baseKey); err != nil {
		return errors.Wrapf(err, "failed to prepare %q", key)
	}
	applyMounts, err := sn.Mounts(ctx, prepareKey)
	if err != nil {
		return errors.Wrapf(err, "failed to get mounts of %q", key)
	}

	usage, err := sn.diffApply(ctx, applyMounts, diffs...)
	if err != nil {
		return errors.Wrap(err, "failed to apply diffs")
	}
	if err := sn.Commit(ctx, key, prepareKey, withMergeUsage(usage)); err != nil {
		return errors.Wrapf(err, "failed to commit %q", key)
	}
	return nil
}

func (sn *mergeSnapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) {
	if info, err := sn.Stat(ctx, key); err != nil {
		return snapshots.Usage{}, err
	} else if usage, ok, err := mergeUsageOf(info); err != nil {
		return snapshots.Usage{}, err
	} else if ok {

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Retry the Merge operation — prepareKey is a fresh identity.NewID() each time, so a retry allocates a new snapshot
  2. Check containerd daemon logs for snapshotter/Mounts errors around the timestamp
  3. Verify no aggressive GC/pruning job runs concurrently with merges
  4. Confirm the snapshotter driver (overlayfs/stargz/native) is healthy on the node
Defensive patterns

Strategy: retry

Validate before calling

// prepareKey is internal; validate the diff endpoints exist
for _, d := range diffs {
    if _, err := sn.Stat(ctx, d.Lower); err != nil { return err }
}

Try / catch

if err := sn.Merge(ctx, key, diffs); err != nil {
    if strings.Contains(err.Error(), "failed to get mounts of") {
        return retryMerge(ctx, key, diffs) // fresh prepareKey on retry
    }
    return err
}

Prevention

When it happens

Trigger: Merge(ctx, key, diffs) where the snapshotter's Mounts call on the freshly prepared prepareKey fails — e.g. snapshot was deleted between Prepare and Mounts, or the overlay backend cannot construct the mount options.

Common situations: Concurrent garbage collection removing prepareKey; containerd snapshotter wedged after node restart; overlayfs kernel/module issues on the host.

Related errors


AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05). Data as JSON: /api/errors/07ca0ce022b3ede9. Report an issue: GitHub.