@@ -135,7 +135,7 @@ func ConvertAndOutput(config types.StackerConfig, tag, name string, layerType ty
135
135
bundlePath := overlayPath (config .RootFSDir , theLayer .Digest )
136
136
overlayDir := path .Join (bundlePath , "overlay" )
137
137
// generate blob
138
- blob , mediaType , rootHash , err := generateBlob (layerType , overlayDir , config .OCIDir )
138
+ blob , mediaType , rootHash , err := generateBlob (layerType , overlayDir , config .OCIDir , nil )
139
139
if err != nil {
140
140
return err
141
141
}
@@ -283,23 +283,23 @@ func (o *overlay) initializeBasesInOutput(name string, layerTypes []types.LayerT
283
283
return nil
284
284
}
285
285
286
- func (o * overlay ) Repack (name string , layerTypes []types.LayerType , sfm types.StackerFiles ) error {
286
+ func (o * overlay ) Repack (name string , layer types. Layer , layerTypes []types.LayerType , sfm types.StackerFiles ) error {
287
287
err := o .initializeBasesInOutput (name , layerTypes , sfm )
288
288
if err != nil {
289
289
return err
290
290
}
291
291
292
- return repackOverlay (o .config , name , layerTypes )
292
+ return repackOverlay (o .config , name , layer , layerTypes )
293
293
}
294
294
295
295
// generateBlob generates either a tar blob or a squashfs blob based on layerType
296
- func generateBlob (layerType types.LayerType , contents string , ociDir string ) (io.ReadCloser , string , string , error ) {
296
+ func generateBlob (layerType types.LayerType , contents string , ociDir string , lowerDirs [] string ) (io.ReadCloser , string , string , error ) {
297
297
var blob io.ReadCloser
298
298
var err error
299
299
var mediaType string
300
300
var rootHash string
301
301
if layerType .Type == "tar" {
302
- packOptions := layer.RepackOptions {TranslateOverlayWhiteouts : true }
302
+ packOptions := layer.RepackOptions {TranslateOverlayWhiteouts : true , OverlayLowerDirs : lowerDirs }
303
303
blob = layer .GenerateInsertLayer (contents , "/" , false , & packOptions )
304
304
mediaType = ispec .MediaTypeImageLayer
305
305
} else {
@@ -382,7 +382,9 @@ func stripOverlayAttrsUnder(dirPath string) error {
382
382
})
383
383
}
384
384
385
- func generateLayer (config types.StackerConfig , oci casext.Engine , mutators []* mutate.Mutator , name string , layerTypes []types.LayerType ) (bool , error ) {
385
+ func generateLayer (config types.StackerConfig , oci casext.Engine , mutators []* mutate.Mutator ,
386
+ name string , layer types.Layer , layerTypes []types.LayerType ,
387
+ ) (bool , error ) {
386
388
dir := path .Join (config .RootFSDir , name , "overlay" )
387
389
ents , err := os .ReadDir (dir )
388
390
if err != nil {
@@ -430,12 +432,27 @@ func generateLayer(config types.StackerConfig, oci casext.Engine, mutators []*mu
430
432
return false , err
431
433
}
432
434
435
+ var ovl overlayMetadata
436
+ if layer .From .Type != types .BuiltLayer {
437
+ ovl , err = readOverlayMetadata (config .RootFSDir , name )
438
+ } else {
439
+ ovl , err = readOverlayMetadata (config .RootFSDir , layer .From .Tag )
440
+ }
441
+ if err != nil {
442
+ return false , err
443
+ }
444
+
433
445
descs := []ispec.Descriptor {}
434
446
for i , layerType := range layerTypes {
435
447
mutator := mutators [i ]
436
448
var desc ispec.Descriptor
437
449
438
- blob , mediaType , rootHash , err := generateBlob (layerType , dir , config .OCIDir )
450
+ lowerDirs := []string {}
451
+ for i := len (ovl .Manifests [layerType ].Layers ) - 1 ; i >= 0 ; i -- {
452
+ lowerDirs = append (lowerDirs , overlayPath (config .RootFSDir , ovl .Manifests [layerType ].Layers [i ].Digest ))
453
+ }
454
+
455
+ blob , mediaType , rootHash , err := generateBlob (layerType , dir , config .OCIDir , lowerDirs )
439
456
if err != nil {
440
457
return false , err
441
458
}
@@ -547,7 +564,7 @@ func generateLayer(config types.StackerConfig, oci casext.Engine, mutators []*mu
547
564
return true , nil
548
565
}
549
566
550
- func repackOverlay (config types.StackerConfig , name string , layerTypes []types.LayerType ) error {
567
+ func repackOverlay (config types.StackerConfig , name string , layer types. Layer , layerTypes []types.LayerType ) error {
551
568
oci , err := umoci .OpenLayout (config .OCIDir )
552
569
if err != nil {
553
570
return err
@@ -602,7 +619,7 @@ func repackOverlay(config types.StackerConfig, name string, layerTypes []types.L
602
619
// generate blobs for each build layer
603
620
for _ , buildLayer := range ovl .BuiltLayers {
604
621
605
- didMutate , err := generateLayer (config , oci , mutators , buildLayer , layerTypes )
622
+ didMutate , err := generateLayer (config , oci , mutators , buildLayer , layer , layerTypes )
606
623
if err != nil {
607
624
return err
608
625
}
@@ -637,7 +654,7 @@ func repackOverlay(config types.StackerConfig, name string, layerTypes []types.L
637
654
return err
638
655
}
639
656
640
- didMutate , err := generateLayer (config , oci , mutators , name , layerTypes )
657
+ didMutate , err := generateLayer (config , oci , mutators , name , layer , layerTypes )
641
658
if err != nil {
642
659
return err
643
660
}
0 commit comments