Skip to content

Commit 0ad7746

Browse files
committed
optimize memory usage in image load with Docker client integration
Signed-off-by: Kay Yan <[email protected]>
1 parent fabfae3 commit 0ad7746

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

pkg/minikube/image/cache.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ limitations under the License.
1717
package image
1818

1919
import (
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, client.WithAPIVersionNegotiation())
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+
161188
func 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
}

pkg/minikube/image/image.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func retrieveImage(ref name.Reference, imgName string) (v1.Image, string, error)
169169
}
170170

171171
func retrieveDaemon(ref name.Reference) (v1.Image, error) {
172-
img, err := daemon.Image(ref, daemon.WithUnbufferedOpener())
172+
img, err := daemon.Image(ref) // uses bufferedOpener, which may consume a significant amount of memory
173173
if err == nil {
174174
klog.Infof("found %s locally: %+v", ref.Name(), img)
175175
return img, nil

0 commit comments

Comments
 (0)