From 237b9dd58bff08b6e7c0a3deaa8071bdd60c0135 Mon Sep 17 00:00:00 2001 From: Isaac Boehman Date: Tue, 1 Apr 2014 14:14:10 -0400 Subject: [PATCH 1/5] Adds basevmdk config directive Docker-DCO-1.1-Signed-off-by: Isaac Boehman (github: yacn) --- config.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.go b/config.go index 25c859a..2b6ea9b 100644 --- a/config.go +++ b/config.go @@ -28,6 +28,7 @@ var B2D struct { VM string // virtual machine name Dir string // boot2docker directory ISO string // boot2docker ISO image path + VMDK string // base VMDK to use as persistent disk DiskSize uint // VM disk image size (MB) Memory uint // VM memory size (MB) @@ -106,6 +107,7 @@ func config() (*flag.FlagSet, error) { flags.StringVar(&B2D.VM, "vm", "boot2docker-vm", "virtual machine name.") flags.StringVarP(&B2D.Dir, "dir", "d", dir, "boot2docker config directory.") flags.StringVar(&B2D.ISO, "iso", filepath.Join(dir, "boot2docker.iso"), "path to boot2docker ISO image.") + flags.StringVar(&B2D.VMDK, "basevmdk", "", "Path to VMDK to use as base for persistent partition") vbm := "VBoxManage" if p := os.Getenv("VBOX_INSTALL_PATH"); p != "" && runtime.GOOS == "windows" { vbm = filepath.Join(p, "VBoxManage.exe") From 980b5abd6cb06293cd31bc1e95038f31f9ff895e Mon Sep 17 00:00:00 2001 From: Isaac Boehman Date: Tue, 1 Apr 2014 14:14:25 -0400 Subject: [PATCH 2/5] updates cmdInit() to check for B2D.VMDK Docker-DCO-1.1-Signed-off-by: Isaac Boehman (github: yacn) --- cmds.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/cmds.go b/cmds.go index ddfaa1e..5723b9a 100644 --- a/cmds.go +++ b/cmds.go @@ -121,10 +121,18 @@ func cmdInit() int { return 1 } - if err := makeDiskImage(diskImg, B2D.DiskSize); err != nil { - logf("Failed to create disk image %q: %s", diskImg, err) - return 1 - } + if B2D.VMDK != "" { + logf("Using %v as base VMDK", B2D.VMDK) + if err := copyDiskImage(diskImg, B2D.VMDK); err != nil { + logf("Failed to copy disk image %v from %v: %s", diskImg, B2D.VMDK, err) + return 1 + } + } else { + if err := makeDiskImage(diskImg, B2D.DiskSize); err != nil { + logf("Failed to create disk image %q: %s", diskImg, err) + return 1 + } + } } if err := m.AttachStorage("SATA", vbx.StorageMedium{Port: 1, Device: 0, DriveType: vbx.DriveHDD, Medium: diskImg}); err != nil { From 781cb9d9c1694a006ec500f19755a3efea75ee03 Mon Sep 17 00:00:00 2001 From: Isaac Boehman Date: Tue, 1 Apr 2014 14:14:47 -0400 Subject: [PATCH 3/5] Adds helper to copy a specified disk image for the persistent partition Docker-DCO-1.1-Signed-off-by: Isaac Boehman (github: yacn) --- vbm.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/vbm.go b/vbm.go index 794b06f..0a13062 100644 --- a/vbm.go +++ b/vbm.go @@ -3,6 +3,7 @@ package main import ( "bytes" "os" + "io" "path/filepath" vbx "github.com/boot2docker/boot2docker-cli/virtualbox" @@ -66,6 +67,35 @@ func getHostOnlyNetworkInterface() (string, error) { return hostonlyNet.Name, nil } +// Copy disk image from given source path to destination +func copyDiskImage(dst, src string) error { + // Open source disk image + srcImg, err := os.Open(src) + if err != nil { + return err + } + closeSrcImg := func() error { + if err := srcImg.Close(); err != nil { + return err + } + return err + } + defer closeSrcImg() + dstImg, err := os.Create(dst) + if err != nil { + return err + } + closeDstImg := func () error { + if err := dstImg.Close(); err != nil { + return err + } + return err + } + defer closeDstImg() + _, err = io.Copy(dstImg, srcImg) + return err +} + // Make a boot2docker VM disk image with the given size (in MB). func makeDiskImage(dest string, size uint) error { // Create the dest dir. From 96eeb1bb75172c3551cd615753b601d6054e6327 Mon Sep 17 00:00:00 2001 From: Isaac Boehman Date: Tue, 1 Apr 2014 16:01:50 -0400 Subject: [PATCH 4/5] Updates in-line deferred function to not return Docker-DCO-1.1-Signed-off-by: Isaac Boehman (github: yacn) --- vbm.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/vbm.go b/vbm.go index 0a13062..3871e3d 100644 --- a/vbm.go +++ b/vbm.go @@ -74,22 +74,20 @@ func copyDiskImage(dst, src string) error { if err != nil { return err } - closeSrcImg := func() error { - if err := srcImg.Close(); err != nil { - return err + closeSrcImg := func() { + if ee := srcImg.Close(); ee != nil { + err = ee } - return err } defer closeSrcImg() dstImg, err := os.Create(dst) if err != nil { return err } - closeDstImg := func () error { - if err := dstImg.Close(); err != nil { - return err + closeDstImg := func() { + if ee := dstImg.Close(); ee != nil { + err = ee } - return err } defer closeDstImg() _, err = io.Copy(dstImg, srcImg) From f28bedb212ffa1f44e90694068cba880aac3bac5 Mon Sep 17 00:00:00 2001 From: Isaac Boehman Date: Wed, 2 Apr 2014 10:28:32 -0400 Subject: [PATCH 5/5] Adds named return value to copyDiskImage() Docker-DCO-1.1-Signed-off-by: Isaac Boehman (github: yacn) --- vbm.go | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/vbm.go b/vbm.go index 3871e3d..962132f 100644 --- a/vbm.go +++ b/vbm.go @@ -2,8 +2,8 @@ package main import ( "bytes" + "io" "os" - "io" "path/filepath" vbx "github.com/boot2docker/boot2docker-cli/virtualbox" @@ -68,30 +68,30 @@ func getHostOnlyNetworkInterface() (string, error) { } // Copy disk image from given source path to destination -func copyDiskImage(dst, src string) error { - // Open source disk image - srcImg, err := os.Open(src) - if err != nil { - return err - } - closeSrcImg := func() { - if ee := srcImg.Close(); ee != nil { - err = ee - } - } - defer closeSrcImg() - dstImg, err := os.Create(dst) - if err != nil { - return err - } - closeDstImg := func() { - if ee := dstImg.Close(); ee != nil { - err = ee - } - } - defer closeDstImg() - _, err = io.Copy(dstImg, srcImg) - return err +func copyDiskImage(dst, src string) (err error) { + // Open source disk image + srcImg, err := os.Open(src) + if err != nil { + return err + } + closeSrcImg := func() { + if ee := srcImg.Close(); ee != nil { + err = ee + } + } + defer closeSrcImg() + dstImg, err := os.Create(dst) + if err != nil { + return err + } + closeDstImg := func() { + if ee := dstImg.Close(); ee != nil { + err = ee + } + } + defer closeDstImg() + _, err = io.Copy(dstImg, srcImg) + return err } // Make a boot2docker VM disk image with the given size (in MB).