@@ -47,10 +47,8 @@ func (i *ImageService) PerformWithBaseFS(ctx context.Context, c *container.Conta
4747// outStream is the writer which the images are written to.
4848//
4949// TODO(thaJeztah): produce JSON stream progress response and image events; see https://github.com/moby/moby/issues/43910
50- func (i * ImageService ) ExportImage (ctx context.Context , names []string , outStream io.Writer ) error {
51- // TODO: Pass as argument
52- var requestedPlatform * ocispec.Platform
53- pm := i .matchRequestedOrDefault (platforms .OnlyStrict , requestedPlatform )
50+ func (i * ImageService ) ExportImage (ctx context.Context , names []string , platform * ocispec.Platform , outStream io.Writer ) error {
51+ pm := i .matchRequestedOrDefault (platforms .OnlyStrict , platform )
5452
5553 opts := []archive.ExportOpt {
5654 archive .WithSkipNonDistributableBlobs (),
@@ -85,7 +83,17 @@ func (i *ImageService) ExportImage(ctx context.Context, names []string, outStrea
8583 return leaseContent (ctx , i .content , leasesManager , lease , target )
8684 }
8785
88- exportImage := func (ctx context.Context , target ocispec.Descriptor , ref reference.Named ) error {
86+ exportImage := func (ctx context.Context , img containerdimages.Image , ref reference.Named ) error {
87+ target := img .Target
88+
89+ if platform != nil {
90+ newTarget , err := i .getPushDescriptor (ctx , img , platform )
91+ if err != nil {
92+ return errors .Wrap (err , "no suitable export target found for platform " + platforms .FormatAll (* platform ))
93+ }
94+ target = newTarget
95+ }
96+
8997 if err := addLease (ctx , target ); err != nil {
9098 return err
9199 }
@@ -142,7 +150,7 @@ func (i *ImageService) ExportImage(ctx context.Context, names []string, outStrea
142150 continue
143151 }
144152
145- if err := exportImage (ctx , img . Target , ref ); err != nil {
153+ if err := exportImage (ctx , img , ref ); err != nil {
146154 return err
147155 }
148156 }
@@ -151,19 +159,20 @@ func (i *ImageService) ExportImage(ctx context.Context, names []string, outStrea
151159 }
152160
153161 for _ , name := range names {
154- target , resolveErr := i .resolveDescriptor (ctx , name )
162+ img , resolveErr := i .resolveImage (ctx , name )
155163
156164 // Check if the requested name is a truncated digest of the resolved descriptor.
157165 // If yes, that means that the user specified a specific image ID so
158166 // it's not referencing a repository.
159167 specificDigestResolved := false
160168 if resolveErr == nil {
161- nameWithoutDigestAlgorithm := strings .TrimPrefix (name , target .Digest .Algorithm ().String ()+ ":" )
162- specificDigestResolved = strings .HasPrefix (target .Digest .Encoded (), nameWithoutDigestAlgorithm )
169+ nameWithoutDigestAlgorithm := strings .TrimPrefix (name , img . Target .Digest .Algorithm ().String ()+ ":" )
170+ specificDigestResolved = strings .HasPrefix (img . Target .Digest .Encoded (), nameWithoutDigestAlgorithm )
163171 }
164172
165173 log .G (ctx ).WithFields (log.Fields {
166174 "name" : name ,
175+ "img" : img ,
167176 "resolveErr" : resolveErr ,
168177 "specificDigestResolved" : specificDigestResolved ,
169178 }).Debug ("export requested" )
@@ -199,7 +208,8 @@ func (i *ImageService) ExportImage(ctx context.Context, names []string, outStrea
199208 if specificDigestResolved {
200209 ref = nil
201210 }
202- if err := exportImage (ctx , target , ref ); err != nil {
211+
212+ if err := exportImage (ctx , img , ref ); err != nil {
203213 return err
204214 }
205215 }
@@ -234,16 +244,17 @@ func leaseContent(ctx context.Context, store content.Store, leasesManager leases
234244// LoadImage uploads a set of images into the repository. This is the
235245// complement of ExportImage. The input stream is an uncompressed tar
236246// ball containing images and metadata.
237- func (i * ImageService ) LoadImage (ctx context.Context , inTar io.ReadCloser , outStream io.Writer , quiet bool ) error {
247+ func (i * ImageService ) LoadImage (ctx context.Context , inTar io.ReadCloser , platform * ocispec. Platform , outStream io.Writer , quiet bool ) error {
238248 decompressed , err := dockerarchive .DecompressStream (inTar )
239249 if err != nil {
240250 return errors .Wrap (err , "failed to decompress input tar archive" )
241251 }
242252 defer decompressed .Close ()
243253
254+ pm := i .matchRequestedOrDefault (platforms .OnlyStrict , platform )
255+
244256 opts := []containerd.ImportOpt {
245- // TODO(vvoland): Allow user to pass platform
246- containerd .WithImportPlatform (platforms .All ),
257+ containerd .WithImportPlatform (pm ),
247258
248259 containerd .WithSkipMissing (),
249260
0 commit comments