Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions pkg/cpio/layer.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,24 @@ import (

// FromLayer converts a container layer to CPIO format.
func FromLayer(layer v1.Layer, dest io.Writer) error {
return FromLayers([]v1.Layer{layer}, dest)
}

// FromLayers converts multiple container layers to a single CPIO archive.
func FromLayers(layers []v1.Layer, dest io.Writer) error {
w := cpio.NewDedupWriter(cpio.Newc.Writer(dest))

for _, layer := range layers {
if err := recordsFromLayer(layer, w); err != nil {
return err
}
}

return w.WriteRecord(cpio.TrailerRecord)
}

// recordsFromLayer reads tar entries from a layer and writes them as CPIO records.
func recordsFromLayer(layer v1.Layer, w cpio.RecordWriter) error {
// Open the filesystem layer to walk through the file.
u, err := layer.Uncompressed()
if err != nil {
Expand All @@ -35,8 +53,6 @@ func FromLayer(layer v1.Layer, dest io.Writer) error {

tarReader := tar.NewReader(u)

w := cpio.NewDedupWriter(cpio.Newc.Writer(dest))

// Iterate through the tar archive entries
for {
header, err := tarReader.Next()
Expand Down Expand Up @@ -95,5 +111,5 @@ func FromLayer(layer v1.Layer, dest io.Writer) error {
}
}

return w.WriteRecord(cpio.TrailerRecord)
return nil
}