@@ -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
0 commit comments