Skip to content

Commit 93be9c4

Browse files
authored
Don't export whiteouts for single layers (#1629)
1 parent d958444 commit 93be9c4

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

pkg/crane/export.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,23 @@ func Export(img v1.Image, w io.Writer) error {
3030
return err
3131
}
3232
if len(layers) == 1 {
33-
// If it's a single layer, we don't have to flatten the filesystem.
34-
// An added perk of skipping mutate.Extract here is that this works
35-
// for non-tarball layers.
33+
// If it's a single layer...
3634
l := layers[0]
37-
rc, err := l.Uncompressed()
35+
mt, err := l.MediaType()
3836
if err != nil {
3937
return err
4038
}
41-
_, err = io.Copy(w, rc)
42-
return err
39+
40+
if !mt.IsLayer() {
41+
// ...and isn't an OCI mediaType, we don't have to flatten it.
42+
// This lets export work for single layer, non-tarball images.
43+
rc, err := l.Uncompressed()
44+
if err != nil {
45+
return err
46+
}
47+
_, err = io.Copy(w, rc)
48+
return err
49+
}
4350
}
4451
fs := mutate.Extract(img)
4552
_, err = io.Copy(w, fs)

pkg/v1/types/types.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,11 @@ func (m MediaType) IsSchema1() bool {
8888
}
8989
return false
9090
}
91+
92+
func (m MediaType) IsLayer() bool {
93+
switch m {
94+
case DockerLayer, DockerUncompressedLayer, OCILayer, OCILayerZStd, OCIUncompressedLayer, DockerForeignLayer, OCIRestrictedLayer, OCIUncompressedRestrictedLayer:
95+
return true
96+
}
97+
return false
98+
}

0 commit comments

Comments
 (0)