MCPcopy
hub / github.com/containerd/containerd / Apply

Method Apply

core/diff/apply/apply.go:62–154  ·  view source on GitHub ↗

Apply applies the content associated with the provided digests onto the provided mounts. Archive content will be extracted and decompressed if necessary.

(ctx context.Context, desc ocispec.Descriptor, mounts []mount.Mount, opts ...diff.ApplyOpt)

Source from the content-addressed store, hash-verified

60// provided mounts. Archive content will be extracted and decompressed if
61// necessary.
62func (s *fsApplier) Apply(ctx context.Context, desc ocispec.Descriptor, mounts []mount.Mount, opts ...diff.ApplyOpt) (d ocispec.Descriptor, err error) {
63 t1 := time.Now()
64 defer func() {
65 if err == nil {
66 log.G(ctx).WithFields(log.Fields{
67 "d": time.Since(t1),
68 "digest": desc.Digest,
69 "size": desc.Size,
70 "media": desc.MediaType,
71 }).Debugf("diff applied")
72 }
73 }()
74
75 var config diff.ApplyConfig
76 for _, o := range opts {
77 if err := o(ctx, desc, &config); err != nil {
78 return emptyDesc, fmt.Errorf("failed to apply config opt: %w", err)
79 }
80 }
81
82 ra, err := s.store.ReaderAt(ctx, desc)
83 if err != nil {
84 return emptyDesc, fmt.Errorf("failed to get reader from content store: %w", err)
85 }
86 var r io.ReadCloser
87 if config.Progress != nil {
88 r = newProgressReader(ra, config.Progress)
89 } else {
90 r = newReadCloser(ra)
91 }
92 defer r.Close()
93
94 var processors []diff.StreamProcessor
95 processor := diff.NewProcessorChain(desc.MediaType, r)
96 processors = append(processors, processor)
97 for {
98 if processor, err = diff.GetProcessor(ctx, processor, config.ProcessorPayloads); err != nil {
99 return emptyDesc, fmt.Errorf("failed to get stream processor for %s: %w", desc.MediaType, err)
100 }
101 processors = append(processors, processor)
102 if processor.MediaType() == ocispec.MediaTypeImageLayer {
103 break
104 }
105 }
106 defer processor.Close()
107
108 digester := digest.Canonical.Digester()
109 rc := &readCounter{
110 r: io.TeeReader(processor, digester.Hash()),
111 }
112
113 // The number of `mounts` that need to be parsed by the mount manager
114 // will be more than 1 in reality; this is needed to work around some
115 // overlayfs/bind shortcuts in core/diff/apply/apply_linux.go
116 if s.mount != nil && len(mounts) > 1 {
117 var b [3]byte
118 // Ignore read failures, just decreases uniqueness
119 rand.Read(b[:])

Callers

nothing calls this directly

Calls 14

NewProcessorChainFunction · 0.92
GetProcessorFunction · 0.92
newProgressReaderFunction · 0.85
newReadCloserFunction · 0.85
CopyMethod · 0.80
applyFunction · 0.70
ReaderAtMethod · 0.65
CloseMethod · 0.65
MediaTypeMethod · 0.65
ReadMethod · 0.65
ActivateMethod · 0.65
DeactivateMethod · 0.65

Tested by

no test coverage detected