diff --git a/core/unpack/unpacker.go b/core/unpack/unpacker.go index a1c49e23b8..642b2dde8c 100644 --- a/core/unpack/unpacker.go +++ b/core/unpack/unpacker.go @@ -428,7 +428,7 @@ func (u *Unpacker) unpack( diff, err := a.Apply(ctx, desc, mounts, unpack.ApplyOpts...) if err != nil { cleanup.Do(ctx, abort) - return fmt.Errorf("failed to extract layer %s: %w", diffIDs[i], err) + return fmt.Errorf("failed to extract layer (%s %s) to %s as %q: %w", desc.MediaType, desc.Digest, unpack.SnapshotterKey, key, err) } if diff.Digest != diffIDs[i] { cleanup.Do(ctx, abort) diff --git a/plugins/services/transfer/service.go b/plugins/services/transfer/service.go index 9b4113f204..fa862a4c33 100644 --- a/plugins/services/transfer/service.go +++ b/plugins/services/transfer/service.go @@ -138,6 +138,7 @@ func (s *service) Transfer(ctx context.Context, req *transferapi.TransferRequest } else if !errdefs.IsNotImplemented(err) { return nil, errgrpc.ToGRPC(err) } + log.G(ctx).WithError(err).Debugf("transfer not implemented for %T to %T", src, dst) } return nil, status.Errorf(codes.Unimplemented, "method Transfer not implemented for %s to %s", req.Source.GetTypeUrl(), req.Destination.GetTypeUrl()) } diff --git a/plugins/transfer/plugin.go b/plugins/transfer/plugin.go index 4c61b898b4..c1041e94c6 100644 --- a/plugins/transfer/plugin.go +++ b/plugins/transfer/plugin.go @@ -30,6 +30,7 @@ import ( "github.com/containerd/containerd/v2/core/metadata" "github.com/containerd/containerd/v2/core/transfer/local" "github.com/containerd/containerd/v2/core/unpack" + "github.com/containerd/containerd/v2/defaults" "github.com/containerd/containerd/v2/internal/kmutex" "github.com/containerd/containerd/v2/pkg/imageverifier" "github.com/containerd/containerd/v2/plugins" @@ -115,6 +116,7 @@ func init() { } applier = inst.(diff.Applier) } else { + var applierID string for name, plugin := range ic.GetAll() { if plugin.Registration.Type != plugins.DiffPlugin { continue @@ -129,14 +131,25 @@ func init() { continue } if applier != nil { - log.G(ic.Context).Warnf("multiple differs match for platform, set `differ` option to choose, skipping %q", plugin.Registration.ID) - continue + skippedApplier := plugin.Registration.ID + + // Prefer the default when multiple plugins match + if skippedApplier == defaults.DefaultDiffer { + skippedApplier = applierID + } + + log.G(ic.Context).Warnf("multiple differs match for platform, set `differ` option to choose, skipping %q", skippedApplier) + + if plugin.Registration.ID == skippedApplier { + continue + } } inst, err := plugin.Instance() if err != nil { return nil, fmt.Errorf("failed to get instance for diff plugin %q: %w", name, err) } applier = inst.(diff.Applier) + applierID = plugin.Registration.ID } } if applier == nil {