Merge pull request #1350 from aaron-prindle/mount-vm-path

Changed mount syntax to be host-path:vm-path
pull/586/merge
Aaron Prindle 2017-04-19 12:03:22 -07:00 committed by GitHub
commit 41c5ba7663
5 changed files with 61 additions and 26 deletions

View File

@ -302,12 +302,12 @@ spec:
You can also achieve persistence by creating a PV in a mounted host folder.
## Mounting Host Folders
`minikube mount /path/to/dir/to/mount` is the recommended way to mount directories into minikube so that they can be used in your local kubernetes cluster. The command works on all supported platforms. Below is an example workflow for using `minikube mount`:
`minikube mount /path/to/dir/to/mount:/vm-mount-path` is the recommended way to mount directories into minikube so that they can be used in your local kubernetes cluster. The command works on all supported platforms. Below is an example workflow for using `minikube mount`:
```
# terminal 1
$ mkdir ~/mount-dir
$ minikube mount ~/mount-dir
$ minikube mount ~/mount-dir:/mount-9p
Mounting /home/user/mount-dir/ into /mount-9p on the minikubeVM
This daemon process needs to stay alive for the mount to still be accessible...
ufs starting

View File

@ -21,6 +21,8 @@ import (
"os"
"sync"
"strings"
"github.com/golang/glog"
"github.com/spf13/cobra"
"k8s.io/minikube/pkg/minikube/cluster"
@ -36,26 +38,41 @@ var mountCmd = &cobra.Command{
Long: `Mounts the specified directory into minikube.`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 1 {
errText := `Please specify a driver name and a directory to be mounted:
\tminikube mount MOUNT_DIRECTORY(ex:"/home")
errText := `Please specify the directory to be mounted:
\tminikube mount HOST_MOUNT_DIRECTORY:VM_MOUNT_DIRECTORY(ex:"/host-home:/vm-home")
`
fmt.Fprintln(os.Stderr, errText)
os.Exit(1)
}
if _, err := os.Stat(args[0]); err != nil {
mountString := args[0]
idx := strings.LastIndex(mountString, ":")
if idx == -1 { // no ":" was present
errText := `Mount directory must be in the form:
\tHOST_MOUNT_DIRECTORY:VM_MOUNT_DIRECTORY`
fmt.Fprintln(os.Stderr, errText)
os.Exit(1)
}
hostPath := mountString[:idx]
vmPath := mountString[idx+1:]
if _, err := os.Stat(hostPath); err != nil {
if os.IsNotExist(err) {
errText := fmt.Sprintf("Cannot find directory %s for mount", args[0])
errText := fmt.Sprintf("Cannot find directory %s for mount", hostPath)
fmt.Fprintln(os.Stderr, errText)
} else {
errText := fmt.Sprintf("Error accesssing directory %s for mount", args[0])
errText := fmt.Sprintf("Error accesssing directory %s for mount", hostPath)
fmt.Fprintln(os.Stderr, errText)
}
os.Exit(1)
}
if len(vmPath) == 0 || !strings.HasPrefix(vmPath, "/") {
errText := fmt.Sprintf("The :VM_MOUNT_DIRECTORY must be an absolute path")
fmt.Fprintln(os.Stderr, errText)
os.Exit(1)
}
var debugVal int
if glog.V(1) {
debugVal = 1 // ufs.StartServer takes int debug param
}
mountDir := args[0]
api, err := machine.NewAPIClient(clientType)
if err != nil {
fmt.Fprintf(os.Stderr, "Error getting client: %s\n", err)
@ -63,15 +80,15 @@ var mountCmd = &cobra.Command{
}
defer api.Close()
fmt.Printf("Mounting %s into /mount-9p on the minikubeVM\n", mountDir)
fmt.Printf("Mounting %s into %s on the minikubeVM\n", hostPath, vmPath)
fmt.Println("This daemon process needs to stay alive for the mount to still be accessible...")
var wg sync.WaitGroup
wg.Add(1)
go func() {
ufs.StartServer(constants.DefaultUfsAddress, debugVal, mountDir)
ufs.StartServer(constants.DefaultUfsAddress, debugVal, hostPath)
wg.Done()
}()
err = cluster.Mount9pHost(api)
err = cluster.MountHost(api, vmPath)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)

View File

@ -398,8 +398,8 @@ func GetHostLogs(api libmachine.API, follow bool) (string, error) {
return s, nil
}
// Mount9pHost runs the mount command from the 9p client on the VM to the 9p server on the host
func Mount9pHost(api libmachine.API) error {
// MountHost runs the mount command from the 9p client on the VM to the 9p server on the host
func MountHost(api libmachine.API, path string) error {
host, err := CheckIfApiExistsAndLoad(api)
if err != nil {
return errors.Wrap(err, "Error checking that api exists and loading it")
@ -408,8 +408,12 @@ func Mount9pHost(api libmachine.API) error {
if err != nil {
return errors.Wrap(err, "Error getting the host IP address to use from within the VM")
}
host.RunSSHCommand(GetMount9pCleanupCommand())
_, err = host.RunSSHCommand(GetMount9pCommand(ip))
host.RunSSHCommand(GetMountCleanupCommand(path))
mountCmd, err := GetMountCommand(ip, path)
if err != nil {
return errors.Wrap(err, "Error getting mount command")
}
_, err = host.RunSSHCommand(mountCmd)
if err != nil {
return err
}

View File

@ -175,16 +175,30 @@ func GetLogsCommand(follow bool) (string, error) {
var localkubeStatusCommand = `sudo systemctl is-active localkube 2>&1 1>/dev/null && echo "Running" || echo "Stopped"`
func GetMount9pCleanupCommand() string {
return `
sudo umount /mount-9p;
sudo rm -rf /mount-9p;
`
func GetMountCleanupCommand(path string) string {
return fmt.Sprintf(`
sudo umount %s;
sudo rm -rf %s;
`, path, path)
}
func GetMount9pCommand(ip net.IP) string {
return fmt.Sprintf(`
sudo mkdir /mount-9p;
sudo mount -t 9p -o trans=tcp -o port=5640 -o uid=1001 -o gid=1001 %s /mount-9p;
sudo chmod 775 /mount-9p;`, ip)
var mountTemplate = `
sudo mkdir -p {{.Path}};
sudo mount -t 9p -o trans=tcp -o port=5640 -o uid=1001 -o gid=1001 {{.IP}} {{.Path}};
sudo chmod 775 {{.Path}};`
func GetMountCommand(ip net.IP, path string) (string, error) {
t := template.Must(template.New("mountCommand").Parse(mountTemplate))
buf := bytes.Buffer{}
data := struct {
IP string
Path string
}{
IP: ip.String(),
Path: path,
}
if err := t.Execute(&buf, data); err != nil {
return "", err
}
return buf.String(), nil
}

View File

@ -44,7 +44,7 @@ func testMounting(t *testing.T) {
}
defer os.RemoveAll(tempDir)
mountCmd := fmt.Sprintf("mount %s", tempDir)
mountCmd := fmt.Sprintf("mount %s:/mount-9p", tempDir)
cmd := minikubeRunner.RunDaemon(mountCmd)
defer cmd.Process.Kill()