diff --git a/pkg/minikube/command/kic_runner.go b/pkg/minikube/command/kic_runner.go index ae14308a22cbb804cfef9e7880a52af79522cb87..76379e3c40c7e4e7ad315c0e5ef68ba24ba32186 100644 --- a/pkg/minikube/command/kic_runner.go +++ b/pkg/minikube/command/kic_runner.go @@ -24,6 +24,7 @@ import ( "os" "os/exec" "path" + "path/filepath" "runtime" "strconv" "strings" @@ -185,7 +186,18 @@ func (k *kicRunner) Copy(f assets.CopyableFile) error { } } klog.Infof("%s (temp): %s --> %s (%d bytes)", k.ociBin, src, dst, f.GetLength()) - tf, err := ioutil.TempFile("", "tmpf-memory-asset") + tmpFolder := "" + + // Snap only allows an application to see its own files in /tmp, making Docker unable to copy memory assets + // https://github.com/kubernetes/minikube/issues/10020 + if isSnapBinary() { + home, err := os.UserHomeDir() + if err != nil { + return errors.Wrap(err, "detecting home dir") + } + tmpFolder = os.Getenv(home) + } + tf, err := ioutil.TempFile(tmpFolder, "tmpf-memory-asset") if err != nil { return errors.Wrap(err, "creating temporary file") } @@ -197,6 +209,15 @@ func (k *kicRunner) Copy(f assets.CopyableFile) error { return k.copy(tf.Name(), dst) } +func isSnapBinary() bool { + ex, err := os.Executable() + if err != nil { + return false + } + exPath := filepath.Dir(ex) + return strings.Contains(exPath, "snap") +} + func (k *kicRunner) copy(src string, dst string) error { fullDest := fmt.Sprintf("%s:%s", k.nameOrID, dst) if k.ociBin == oci.Podman {