From 8d40d8219cb358f37135c77f24f022e83c4e285d Mon Sep 17 00:00:00 2001 From: Evan Hazlett Date: Mon, 12 Jan 2015 15:20:03 -0500 Subject: [PATCH] fixes #229: wait for docker before adding to known_hosts Signed-off-by: Evan Hazlett --- drivers/virtualbox/virtualbox.go | 10 +++++++++- host.go | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index 9de8197882..588ce687b1 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -332,6 +332,14 @@ func (d *Driver) Create() error { return err } + cmd, err = d.GetSSHCommand("if [ -e /var/run/docker.pid ]; then sudo /etc/init.d/docker stop; fi") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + // HACK: configure docker to use persisted auth cmd, err = d.GetSSHCommand("echo DOCKER_TLS=no | sudo tee -a /var/lib/boot2docker/profile") if err != nil { @@ -355,7 +363,7 @@ func (d *Driver) Create() error { return err } - cmd, err = d.GetSSHCommand("sudo /etc/init.d/docker restart") + cmd, err = d.GetSSHCommand("sudo /etc/init.d/docker start") if err != nil { return err } diff --git a/host.go b/host.go index 58e534132d..ddfa307f81 100644 --- a/host.go +++ b/host.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "net" "net/url" "os" "path/filepath" @@ -33,6 +34,19 @@ type hostConfig struct { DriverName string } +func waitForDocker(addr string) error { + for { + conn, err := net.DialTimeout("tcp", addr, time.Second*5) + if err != nil { + time.Sleep(time.Second * 5) + continue + } + conn.Close() + break + } + return nil +} + func NewHost(name, driverName, storePath string) (*Host, error) { driver, err := drivers.NewDriver(driverName, storePath) if err != nil { @@ -156,6 +170,10 @@ func (h *Host) addHostToKnownHosts() error { tlsConfig.InsecureSkipVerify = true + log.Debugf("waiting for Docker to become available on %s", addr) + if err := waitForDocker(addr); err != nil { + return fmt.Errorf("unable to connect to Docker daemon: %s", err) + } testConn, err := tls.Dial(proto, addr, tlsConfig) if err != nil { return fmt.Errorf("tls Handshake error: %s", err)