@@ -30,6 +30,7 @@ import (
3030 "github.com/google/go-containerregistry/pkg/v1/match"
3131 "github.com/google/go-containerregistry/pkg/v1/mutate"
3232 "github.com/google/go-containerregistry/pkg/v1/tarball"
33+ "github.com/google/go-containerregistry/pkg/v1/types"
3334 "github.com/spf13/cobra"
3435)
3536
@@ -45,16 +46,33 @@ var CommandAppendLayers = cobra.Command{
4546 return
4647 }
4748
49+ path , err := layout .FromPath (oci )
50+ must ("could not load oci directory" , err )
51+
52+ index , err := path .ImageIndex ()
53+ must ("could not load oci image index" , err )
54+
55+ indexMediaType , err := index .MediaType ()
56+ must ("could not get image index media type" , err )
57+
58+ layerType := types .DockerLayer
59+ if indexMediaType == types .OCIImageIndex {
60+ layerType = types .OCILayer
61+ }
62+
4863 layers := []v1.Layer {}
4964 for _ , path := range extra {
50- layers = append (layers , loadLayerFromDirOrTarball (path ))
65+ layers = append (layers , loadLayerFromDirOrTarball (path , layerType ))
5166 }
5267
53- appendLayersToAllImages (oci , layers ... )
68+ index = appendLayersToImageIndex (index , layers )
69+
70+ _ , err = layout .Write (oci , index )
71+ must ("could not write image" , err )
5472 },
5573}
5674
57- func loadLayerFromDirOrTarball (path string ) v1.Layer {
75+ func loadLayerFromDirOrTarball (path string , mediaType types. MediaType ) v1.Layer {
5876 stat , err := os .Stat (path )
5977 must ("could not open directory or tarball" , err )
6078
@@ -102,31 +120,24 @@ func loadLayerFromDirOrTarball(path string) v1.Layer {
102120
103121 byts := buf .Bytes ()
104122
105- layer , err = tarball .LayerFromOpener (func () (io.ReadCloser , error ) {
106- return io .NopCloser (bytes .NewReader (byts )), nil
107- })
123+ layer , err = tarball .LayerFromOpener (
124+ func () (io.ReadCloser , error ) {
125+ return io .NopCloser (bytes .NewReader (byts )), nil
126+ },
127+ tarball .WithMediaType (mediaType ),
128+ )
108129
109130 } else {
110- layer , err = tarball .LayerFromFile (path )
131+ layer , err = tarball .LayerFromFile (
132+ path ,
133+ tarball .WithMediaType (mediaType ),
134+ )
111135 }
112136
113137 must ("could not open directory or tarball" , err )
114138 return layer
115139}
116140
117- func appendLayersToAllImages (oci string , layers ... v1.Layer ) {
118- path , err := layout .FromPath (oci )
119- must ("could not load oci directory" , err )
120-
121- index , err := path .ImageIndex ()
122- must ("could not load oci image index" , err )
123-
124- index = appendLayersToImageIndex (index , layers )
125-
126- _ , err = layout .Write (oci , index )
127- must ("could not write image" , err )
128- }
129-
130141func appendLayersToImageIndex (index v1.ImageIndex , layers []v1.Layer ) v1.ImageIndex {
131142 manifest , err := index .IndexManifest ()
132143 must ("could not load oci image manifest" , err )
@@ -145,11 +156,15 @@ func appendLayersToImageIndex(index v1.ImageIndex, layers []v1.Layer) v1.ImageIn
145156 digest , err := img .Digest ()
146157 must ("could not get image digest" , err )
147158
159+ size , err := img .Size ()
160+ must ("could not get image size" , err )
161+
148162 slog .Info ("appended layers to image" , "old_digest" , descriptor .Digest , "digest" , digest , "platform" , descriptor .Platform )
149163
150164 index = mutate .RemoveManifests (index , match .Digests (descriptor .Digest ))
151165
152166 descriptor .Digest = digest
167+ descriptor .Size = size
153168 index = mutate .AppendManifests (index , mutate.IndexAddendum {
154169 Add : img ,
155170 Descriptor : descriptor ,
@@ -159,16 +174,20 @@ func appendLayersToImageIndex(index v1.ImageIndex, layers []v1.Layer) v1.ImageIn
159174 slog .Info ("found image index" , "digest" , descriptor .Digest )
160175
161176 child , err := index .ImageIndex (descriptor .Digest )
162- must ("could not load oci image manifest" , err )
177+ must ("could not load oci index manifest" , err )
163178
164179 child = appendLayersToImageIndex (child , layers )
165180
166181 digest , err := child .Digest ()
167- must ("could not get image digest" , err )
182+ must ("could not get index digest" , err )
183+
184+ size , err := child .Size ()
185+ must ("could not get index size" , err )
168186
169187 index = mutate .RemoveManifests (index , match .Digests (descriptor .Digest ))
170188
171189 descriptor .Digest = digest
190+ descriptor .Size = size
172191 index = mutate .AppendManifests (index , mutate.IndexAddendum {
173192 Add : child ,
174193 Descriptor : descriptor ,
0 commit comments