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

Function writeContentsForImage

pkg/imgutil/commit/commit.go:300–382  ·  view source on GitHub ↗

writeContentsForImage will commit oci image config and manifest into containerd's content store.

(ctx context.Context, snName string, baseImg containerd.Image, newConfig ocispec.Image, diffLayerDesc ocispec.Descriptor, opts *Opts)

Source from the content-addressed store, hash-verified

298
299// writeContentsForImage will commit oci image config and manifest into containerd's content store.
300func writeContentsForImage(ctx context.Context, snName string, baseImg containerd.Image, newConfig ocispec.Image, diffLayerDesc ocispec.Descriptor, opts *Opts) (ocispec.Descriptor, digest.Digest, error) {
301 newConfigJSON, err := json.Marshal(newConfig)
302 if err != nil {
303 return ocispec.Descriptor{}, emptyDigest, err
304 }
305
306 // Select media types based on format choice
307 var configMediaType, manifestMediaType string
308 switch opts.Format {
309 case types.ImageFormatOCI:
310 configMediaType = ocispec.MediaTypeImageConfig
311 manifestMediaType = ocispec.MediaTypeImageManifest
312 case types.ImageFormatDocker:
313 configMediaType = images.MediaTypeDockerSchema2Config
314 manifestMediaType = images.MediaTypeDockerSchema2Manifest
315 default:
316 // Default to Docker Schema2 for compatibility
317 configMediaType = images.MediaTypeDockerSchema2Config
318 manifestMediaType = images.MediaTypeDockerSchema2Manifest
319 }
320
321 configDesc := ocispec.Descriptor{
322 MediaType: configMediaType,
323 Digest: digest.FromBytes(newConfigJSON),
324 Size: int64(len(newConfigJSON)),
325 }
326
327 cs := baseImg.ContentStore()
328 baseMfst, _, err := imgutil.ReadManifest(ctx, baseImg)
329 if err != nil {
330 return ocispec.Descriptor{}, emptyDigest, err
331 }
332 layers := append(baseMfst.Layers, diffLayerDesc)
333
334 newMfst := struct {
335 MediaType string `json:"mediaType,omitempty"`
336 ocispec.Manifest
337 }{
338 MediaType: manifestMediaType,
339 Manifest: ocispec.Manifest{
340 Versioned: specs.Versioned{
341 SchemaVersion: 2,
342 },
343 Config: configDesc,
344 Layers: layers,
345 },
346 }
347
348 newMfstJSON, err := json.MarshalIndent(newMfst, "", " ")
349 if err != nil {
350 return ocispec.Descriptor{}, emptyDigest, err
351 }
352
353 newMfstDesc := ocispec.Descriptor{
354 MediaType: manifestMediaType,
355 Digest: digest.FromBytes(newMfstJSON),
356 Size: int64(len(newMfstJSON)),
357 }

Callers 1

CommitFunction · 0.85

Calls 3

ReadManifestFunction · 0.92
MarshalMethod · 0.80
StringMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…