Skip to content

Commit 6bce25e

Browse files
authored
Detect zstd in crane append (#2023)
We assumed everything was gzip, which is not always true! Signed-off-by: Jon Johnson <[email protected]>
1 parent 06dcd85 commit 6bce25e

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

pkg/crane/append.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ import (
1818
"fmt"
1919
"os"
2020

21+
comp "github.com/google/go-containerregistry/internal/compression"
2122
"github.com/google/go-containerregistry/internal/windows"
23+
"github.com/google/go-containerregistry/pkg/compression"
2224
v1 "github.com/google/go-containerregistry/pkg/v1"
2325
"github.com/google/go-containerregistry/pkg/v1/mutate"
2426
"github.com/google/go-containerregistry/pkg/v1/stream"
@@ -50,13 +52,11 @@ func Append(base v1.Image, paths ...string) (v1.Image, error) {
5052
}
5153

5254
baseMediaType, err := base.MediaType()
53-
5455
if err != nil {
5556
return nil, fmt.Errorf("getting base image media type: %w", err)
5657
}
5758

5859
layerType := types.DockerLayer
59-
6060
if baseMediaType == types.OCIManifestSchema1 {
6161
layerType = types.OCILayer
6262
}
@@ -90,6 +90,21 @@ func getLayer(path string, layerType types.MediaType) (v1.Layer, error) {
9090
return stream.NewLayer(f, stream.WithMediaType(layerType)), nil
9191
}
9292

93+
// This is dumb but the tarball package assumes things about mediaTypes that aren't true
94+
// and doesn't have enough context to know what the right default is.
95+
f, err = os.Open(path)
96+
if err != nil {
97+
return nil, err
98+
}
99+
defer f.Close()
100+
z, _, err := comp.PeekCompression(f)
101+
if err != nil {
102+
return nil, err
103+
}
104+
if z == compression.ZStd {
105+
layerType = types.OCILayerZStd
106+
}
107+
93108
return tarball.LayerFromFile(path, tarball.WithMediaType(layerType))
94109
}
95110

pkg/crane/append_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,28 @@ func TestAppendWithDockerBaseImage(t *testing.T) {
7171
t.Errorf("MediaType(): want %q, got %q", want, got)
7272
}
7373
}
74+
75+
func TestAppendWithZstd(t *testing.T) {
76+
base := mutate.MediaType(empty.Image, types.OCIManifestSchema1)
77+
img, err := crane.Append(base, "testdata/content.tar.zst")
78+
79+
if err != nil {
80+
t.Fatalf("crane.Append(): %v", err)
81+
}
82+
83+
layers, err := img.Layers()
84+
85+
if err != nil {
86+
t.Fatalf("img.Layers(): %v", err)
87+
}
88+
89+
mediaType, err := layers[0].MediaType()
90+
91+
if err != nil {
92+
t.Fatalf("layers[0].MediaType(): %v", err)
93+
}
94+
95+
if got, want := mediaType, types.OCILayerZStd; got != want {
96+
t.Errorf("MediaType(): want %q, got %q", want, got)
97+
}
98+
}

pkg/crane/testdata/content.tar.zst

147 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)