MCPcopy Create free account
hub / github.com/containerd/nerdctl / createDiff

Function createDiff

pkg/imgutil/commit/commit.go:385–530  ·  view source on GitHub ↗

createDiff creates a layer diff into containerd's content store.

(ctx context.Context, name string, sn snapshots.Snapshotter, cs content.Store, comparer diff.Comparer, compression types.CompressionType, opts *Opts)

Source from the content-addressed store, hash-verified

383
384// createDiff creates a layer diff into containerd's content store.
385func createDiff(ctx context.Context, name string, sn snapshots.Snapshotter, cs content.Store, comparer diff.Comparer, compression types.CompressionType, opts *Opts) (ocispec.Descriptor, digest.Digest, error) {
386 diffOpts := make([]diff.Opt, 0)
387 var mediaType string
388
389 // Select media type based on format and compression
390 switch opts.Format {
391 case types.ImageFormatOCI:
392 // Use OCI media types
393 switch compression {
394 case types.Zstd:
395 diffOpts = append(diffOpts, diff.WithMediaType(ocispec.MediaTypeImageLayerZstd))
396 mediaType = ocispec.MediaTypeImageLayerZstd
397 default:
398 diffOpts = append(diffOpts, diff.WithMediaType(ocispec.MediaTypeImageLayerGzip))
399 mediaType = ocispec.MediaTypeImageLayerGzip
400 }
401 case types.ImageFormatDocker:
402 // Use Docker Schema2 media types for compatibility
403 switch compression {
404 case types.Zstd:
405 diffOpts = append(diffOpts, diff.WithMediaType(ocispec.MediaTypeImageLayerZstd))
406 mediaType = images.MediaTypeDockerSchema2LayerZstd
407 default:
408 diffOpts = append(diffOpts, diff.WithMediaType(ocispec.MediaTypeImageLayerGzip))
409 mediaType = images.MediaTypeDockerSchema2LayerGzip
410 }
411 default:
412 // Default to Docker Schema2 media types for compatibility
413 switch compression {
414 case types.Zstd:
415 diffOpts = append(diffOpts, diff.WithMediaType(ocispec.MediaTypeImageLayerZstd))
416 mediaType = images.MediaTypeDockerSchema2LayerZstd
417 default:
418 diffOpts = append(diffOpts, diff.WithMediaType(ocispec.MediaTypeImageLayerGzip))
419 mediaType = images.MediaTypeDockerSchema2LayerGzip
420 }
421 }
422
423 newDesc, err := rootfs.CreateDiff(ctx, name, sn, comparer, diffOpts...)
424 if err != nil {
425 return ocispec.Descriptor{}, digest.Digest(""), err
426 }
427
428 info, err := cs.Info(ctx, newDesc.Digest)
429 if err != nil {
430 return ocispec.Descriptor{}, digest.Digest(""), err
431 }
432
433 diffIDStr, ok := info.Labels["containerd.io/uncompressed"]
434 if !ok {
435 return ocispec.Descriptor{}, digest.Digest(""), fmt.Errorf("invalid differ response with no diffID")
436 }
437
438 diffID, err := digest.Parse(diffIDStr)
439 if err != nil {
440 return ocispec.Descriptor{}, digest.Digest(""), err
441 }
442

Callers 1

CommitFunction · 0.85

Calls 2

InfoMethod · 0.80
ParseMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…