@@ -181,15 +181,10 @@ func (r *runtime) ImportImages(ctx context.Context, refs ...string) error {
181181
182182 for _ , ref := range refs {
183183 // fix: pull with unpack do not fetch missing contents
184- img , err := r .client .Fetch (ctx , ref , containerd .WithPlatformMatcher (r .platform ), containerd .WithResolver (r .resolver ))
184+ _ , err := r .client .Fetch (ctx , ref , containerd .WithPlatformMatcher (r .platform ), containerd .WithResolver (r .resolver ))
185185 if err != nil {
186186 return fmt .Errorf ("import %s: %w" , ref , err )
187187 }
188-
189- err = containerd .NewImageWithPlatform (r .client , img , r .platform ).Unpack (ctx , containerd .DefaultSnapshotter )
190- if err != nil {
191- return fmt .Errorf ("unpack %s: %w" , ref , err )
192- }
193188 }
194189 return nil
195190}
@@ -205,6 +200,15 @@ func (r *runtime) RemoveImage(ctx context.Context, ref string) error {
205200 return ignoreNotFoundError (err )
206201}
207202
203+ func (r * runtime ) UnpackImage (ctx context.Context , ref string ) error {
204+ ctx = namespaces .WithNamespace (ctx , r .namespace )
205+ img , err := r .getImage (ctx , ref )
206+ if err != nil {
207+ return err
208+ }
209+ return unpackImage (ctx , img , containerd .DefaultSnapshotter )
210+ }
211+
208212func (r * runtime ) GetImage (ctx context.Context , ref string ) (* images.Image , bool , error ) {
209213 ctx = namespaces .WithNamespace (ctx , r .namespace )
210214
@@ -549,22 +553,27 @@ func withoutAnyMounts() oci.SpecOpts {
549553func withNewSnapshotAndConfig (img containerd.Image , configContent []model.ConfigFile ) containerd.NewContainerOpts {
550554 return func (ctx context.Context , client * containerd.Client , c * containers.Container ) error {
551555 var (
552- snapshotID = rand .String (10 )
553- data = toRawConfig (configContent )
554- descriptor = v1.Descriptor {
556+ snapshotID = rand .String (10 )
557+ snapshotterName = containerd .DefaultSnapshotter
558+ data = toRawConfig (configContent )
559+ descriptor = v1.Descriptor {
555560 MediaType : v1 .MediaTypeImageLayer ,
556561 Digest : digest .SHA256 .FromBytes (data ),
557562 Size : int64 (len (data )),
558563 }
559564 ref = fmt .Sprintf ("ingest-%s" , descriptor .Digest )
560565 )
561566
562- diffIDs , err := img . RootFS (ctx )
567+ err := unpackImage (ctx , img , snapshotterName )
563568 if err != nil {
564569 return err
565570 }
566571
567- mounts , err := client .SnapshotService (containerd .DefaultSnapshotter ).Prepare (ctx , snapshotID , identity .ChainID (diffIDs ).String ())
572+ diffIDs , err := img .RootFS (ctx )
573+ if err != nil {
574+ return err
575+ }
576+ mounts , err := client .SnapshotService (snapshotterName ).Prepare (ctx , snapshotID , identity .ChainID (diffIDs ).String ())
568577 if err != nil {
569578 return err
570579 }
@@ -734,3 +743,16 @@ func withAllowAllDevices(_ context.Context, _ oci.Client, _ *containers.Containe
734743 }
735744 return nil
736745}
746+
747+ func unpackImage (ctx context.Context , img containerd.Image , snapshotterName string ) error {
748+ unpacked , err := img .IsUnpacked (ctx , snapshotterName )
749+ if err != nil {
750+ return err
751+ }
752+ if ! unpacked {
753+ if err := img .Unpack (ctx , snapshotterName ); err != nil {
754+ return err
755+ }
756+ }
757+ return nil
758+ }
0 commit comments