@@ -296,11 +296,17 @@ func (i *ContainersImageRegistry) unpackImage(ctx context.Context, unpackPath st
296
296
return wrapTerminal (fmt .Errorf ("catalog image is missing the required label %q" , ConfigDirLabel ), specIsCanonical )
297
297
}
298
298
299
- if err := os .MkdirAll (unpackPath , 0700 ); err != nil {
300
- return fmt .Errorf ("error creating unpack directory: %w" , err )
301
- }
302
299
l := log .FromContext (ctx )
303
- l .Info ("unpacking image" , "path" , unpackPath )
300
+ l .Info ("unpacking image" , "path" , unpackPath , "temp path" , tempUnpackPath )
301
+ tempUnpackPath , err := os .MkdirTemp ("" , fmt .Sprintf ("unpack-%s" , catalog .Name ))
302
+ if err != nil {
303
+ return fmt .Errorf ("error creating temporary unpack directory: %w" , err )
304
+ }
305
+ defer func () {
306
+ if err := os .RemoveAll (tempUnpackPath ); err != nil {
307
+ l .Error (err , "error removing temporary unpack directory" )
308
+ }
309
+ }()
304
310
for i , layerInfo := range img .LayerInfos () {
305
311
if err := func () error {
306
312
layerReader , _ , err := layoutSrc .GetBlob (ctx , layerInfo , none .NoCache )
@@ -309,15 +315,21 @@ func (i *ContainersImageRegistry) unpackImage(ctx context.Context, unpackPath st
309
315
}
310
316
defer layerReader .Close ()
311
317
312
- if err := applyLayer (ctx , unpackPath , dirToUnpack , layerReader ); err != nil {
318
+ if err := applyLayer (ctx , tempUnpackPath , dirToUnpack , layerReader ); err != nil {
313
319
return fmt .Errorf ("error applying layer[%d]: %w" , i , err )
314
320
}
315
321
l .Info ("applied layer" , "layer" , i )
316
322
return nil
317
323
}(); err != nil {
318
- return errors .Join (err , deleteRecursive (unpackPath ))
324
+ return errors .Join (err , deleteRecursive (tempUnpackPath ))
319
325
}
320
326
}
327
+ if err := os .MkdirAll (unpackPath , 0700 ); err != nil {
328
+ return fmt .Errorf ("error creating unpack directory: %w" , err )
329
+ }
330
+ if err := os .Rename (tempUnpackPath , unpackPath ); err != nil {
331
+ return fmt .Errorf ("error moving temporary unpack directory to final unpack directory: %w" , err )
332
+ }
321
333
if err := setReadOnlyRecursive (unpackPath ); err != nil {
322
334
return fmt .Errorf ("error making unpack directory read-only: %w" , err )
323
335
}
0 commit comments