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)
| 383 | |
| 384 | // createDiff creates a layer diff into containerd's content store. |
| 385 | func 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 |