@@ -17,10 +17,13 @@ limitations under the License.
1717package image
1818
1919import (
20+ "context"
21+ "io"
2022 "os"
2123 "path/filepath"
2224 "time"
2325
26+ "github.com/docker/docker/client"
2427 "github.com/google/go-containerregistry/pkg/name"
2528 v1 "github.com/google/go-containerregistry/pkg/v1"
2629 "github.com/google/go-containerregistry/pkg/v1/tarball"
@@ -84,7 +87,6 @@ func SaveToDir(images []string, cacheDir string, overwrite bool) error {
8487 if err := g .Wait (); err != nil {
8588 return errors .Wrap (err , "caching images" )
8689 }
87- klog .Infoln ("Successfully saved all images to host disk." )
8890 return nil
8991}
9092
@@ -158,6 +160,31 @@ func saveToTarFile(iname, rawDest string, overwrite bool) error {
158160 return nil
159161}
160162
163+ func saveImageWithDockerClient (f * os.File , ref name.Reference ) error {
164+ cli , err := client .NewClientWithOpts (client .FromEnv )
165+ if err != nil {
166+ return errors .Wrap (err , "creating docker client" )
167+ }
168+ defer cli .Close ()
169+
170+ ctx := context .Background ()
171+
172+ imageResponse , err := cli .ImageSave (ctx , []string {ref .String ()})
173+ if err != nil {
174+ return errors .Wrap (err , "saving image via docker client" )
175+ }
176+ defer imageResponse .Close ()
177+
178+ // Copy image data stream to file
179+ _ , err = io .Copy (f , imageResponse )
180+ if err != nil {
181+ return errors .Wrap (err , "copying image data to file" )
182+ }
183+
184+ klog .Infof ("Successfully saved image %s using Docker client" , ref .String ())
185+ return nil
186+ }
187+
161188func writeImage (img v1.Image , dst string , ref name.Reference ) error {
162189 klog .Infoln ("opening: " , dst )
163190 f , err := os .CreateTemp (filepath .Dir (dst ), filepath .Base (dst )+ ".*.tmp" )
@@ -175,7 +202,12 @@ func writeImage(img v1.Image, dst string, ref name.Reference) error {
175202 }
176203 }()
177204
178- err = tarball .Write (ref , img , f )
205+ if useDaemon {
206+ // Use Docker client to save image to file
207+ err = saveImageWithDockerClient (f , ref )
208+ } else {
209+ err = tarball .Write (ref , img , f )
210+ }
179211 if err != nil {
180212 return errors .Wrap (err , "write" )
181213 }
0 commit comments