From 25ad2d35d9a489a5fdcf6f053315e54b2605b625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Tue, 17 Apr 2018 22:10:20 +0200 Subject: [PATCH 1/2] Optionally use podman load instead of docker load --- pkg/minikube/machine/cache_images.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pkg/minikube/machine/cache_images.go b/pkg/minikube/machine/cache_images.go index 9f342846b9e7..a8d05d87c370 100644 --- a/pkg/minikube/machine/cache_images.go +++ b/pkg/minikube/machine/cache_images.go @@ -85,12 +85,17 @@ func CacheImages(images []string, cacheDir string) error { func LoadImages(cmd bootstrapper.CommandRunner, images []string, cacheDir string) error { var g errgroup.Group + // Load profile cluster config from file + cc, err := config.Load() + if err != nil && !os.IsNotExist(err) { + glog.Errorln("Error loading profile config: ", err) + } for _, image := range images { image := image g.Go(func() error { src := filepath.Join(cacheDir, image) src = sanitizeCacheDir(src) - if err := LoadFromCacheBlocking(cmd, src); err != nil { + if err := LoadFromCacheBlocking(cmd, cc.KubernetesConfig, src); err != nil { return errors.Wrapf(err, "loading image %s", src) } return nil @@ -190,7 +195,7 @@ func getWindowsVolumeNameCmd(d string) (string, error) { return vname, nil } -func LoadFromCacheBlocking(cmd bootstrapper.CommandRunner, src string) error { +func LoadFromCacheBlocking(cmd bootstrapper.CommandRunner, k8s config.KubernetesConfig, src string) error { glog.Infoln("Loading image from cache at ", src) filename := filepath.Base(src) for { @@ -207,7 +212,12 @@ func LoadFromCacheBlocking(cmd bootstrapper.CommandRunner, src string) error { return errors.Wrap(err, "transferring cached image") } - dockerLoadCmd := "docker load -i " + dst + var dockerLoadCmd string + if k8s.ContainerRuntime == constants.CrioRuntime || k8s.ContainerRuntime == constants.Cri_oRuntime { + dockerLoadCmd = "sudo podman load -i " + dst + } else { + dockerLoadCmd = "docker load -i " + dst + } if err := cmd.Run(dockerLoadCmd); err != nil { return errors.Wrapf(err, "loading docker image: %s", dst) From 98a2a557c584ee5eeae9355a2922bd8fd9da4a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Sat, 22 Sep 2018 23:12:01 +0200 Subject: [PATCH 2/2] Cache just one image at a time, when using podman To not run out of memory due to loading the images, since it does not have a daemon to serialize things (like Docker does) --- pkg/minikube/machine/cache_images.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pkg/minikube/machine/cache_images.go b/pkg/minikube/machine/cache_images.go index a8d05d87c370..9bf393de95c2 100644 --- a/pkg/minikube/machine/cache_images.go +++ b/pkg/minikube/machine/cache_images.go @@ -24,6 +24,7 @@ import ( "path/filepath" "runtime" "strings" + "sync" "github.com/google/go-containerregistry/pkg/v1/tarball" @@ -48,6 +49,8 @@ const tempLoadDir = "/tmp" var getWindowsVolumeName = getWindowsVolumeNameCmd +var podmanLoad sync.Mutex + func CacheImagesForBootstrapper(version string, clusterBootstrapper string) error { images := bootstrapper.GetCachedImageList(version, clusterBootstrapper) @@ -213,16 +216,25 @@ func LoadFromCacheBlocking(cmd bootstrapper.CommandRunner, k8s config.Kubernetes } var dockerLoadCmd string - if k8s.ContainerRuntime == constants.CrioRuntime || k8s.ContainerRuntime == constants.Cri_oRuntime { + crio := k8s.ContainerRuntime == constants.CrioRuntime || k8s.ContainerRuntime == constants.Cri_oRuntime + if crio { dockerLoadCmd = "sudo podman load -i " + dst } else { dockerLoadCmd = "docker load -i " + dst } + if crio { + podmanLoad.Lock() + } + if err := cmd.Run(dockerLoadCmd); err != nil { return errors.Wrapf(err, "loading docker image: %s", dst) } + if crio { + podmanLoad.Unlock() + } + if err := cmd.Run("sudo rm -rf " + dst); err != nil { return errors.Wrap(err, "deleting temp docker image location") }