diff --git a/commands.go b/commands.go index 3d1ae81179..60a7578b2c 100644 --- a/commands.go +++ b/commands.go @@ -25,6 +25,9 @@ import ( _ "github.com/docker/machine/drivers/vmwarefusion" _ "github.com/docker/machine/drivers/vmwarevcloudair" _ "github.com/docker/machine/drivers/vmwarevsphere" + + //_ "github.com/docker/machine/drivers/vmwarevcloudair" + //_ "github.com/docker/machine/drivers/vmwarevsphere" "github.com/docker/machine/state" ) diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 08ab5909d2..2e63424a5a 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -26,6 +26,7 @@ const ( defaultInstanceType = "t2.micro" defaultRootSize = 16 ipRange = "0.0.0.0/0" + dockerConfigDir = "/etc/docker" ) type Driver struct { @@ -380,6 +381,38 @@ func (d *Driver) Kill() error { return nil } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker stop") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + func (d *Driver) Upgrade() error { sshCmd, err := d.GetSSHCommand("apt-get update && apt-get install -y lxc-docker") if err != nil { diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index 122a544d0a..cda24f87f2 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -20,6 +20,10 @@ import ( "github.com/docker/machine/state" ) +const ( + dockerConfigDir = "/etc/docker" +) + type Driver struct { MachineName string SubscriptionID string @@ -508,6 +512,38 @@ func (driver *Driver) Kill() error { return nil } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker stop") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + func (driver *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) { err := driver.setUserSubscription() if err != nil { diff --git a/drivers/digitalocean/digitalocean.go b/drivers/digitalocean/digitalocean.go index 837c93960e..2ad1540ee8 100644 --- a/drivers/digitalocean/digitalocean.go +++ b/drivers/digitalocean/digitalocean.go @@ -18,6 +18,10 @@ import ( "github.com/docker/machine/state" ) +const ( + dockerConfigDir = "/etc/docker" +) + type Driver struct { AccessToken string DropletID int @@ -260,6 +264,38 @@ func (d *Driver) Kill() error { return err } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker stop") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + func (d *Driver) Upgrade() error { sshCmd, err := d.GetSSHCommand("apt-get update && apt-get install lxc-docker") if err != nil { diff --git a/drivers/drivers.go b/drivers/drivers.go index fdbcc68d39..cb507c2638 100644 --- a/drivers/drivers.go +++ b/drivers/drivers.go @@ -51,9 +51,18 @@ type Driver interface { // Kill stops a host forcefully Kill() error + // RestartDocker restarts a Docker daemon on the machine + StartDocker() error + + // RestartDocker restarts a Docker daemon on the machine + StopDocker() error + // Upgrade the version of Docker on the host to the latest version Upgrade() error + // GetDockerConfigDir returns the config directory for storing daemon configs + GetDockerConfigDir() string + // GetSSHCommand returns a command for SSH pointing at the correct user, host // and keys for the host with args appended. If no args are passed, it will // initiate an interactive SSH session as if SSH were passed no args. diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index 2809194e81..16a312c4d2 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -41,8 +41,7 @@ var ( `sudo mkdir -p /.docker/authorized-keys.d/ sudo chown -R {{ .UserName }} /.docker while [ -e /var/run/docker.pid ]; do sleep 1; done -sudo sed -i 's@DOCKER_OPTS=.*@DOCKER_OPTS=\"--auth=identity -H unix://var/run/docker.sock -H 0.0.0.0:2376\"@g' /etc/default/docker -sudo wget https://bfirsh.s3.amazonaws.com/docker/docker-1.3.1-dev-identity-auth -O /usr/bin/docker && sudo chmod +x /usr/bin/docker +sudo curl -L -o /usr/bin/docker https://get.docker.com/builds/Linux/x86_64/docker-latest `)) ) diff --git a/drivers/google/google.go b/drivers/google/google.go index 7dfaa01eb1..7a8ad5be74 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -14,6 +14,10 @@ import ( "github.com/docker/machine/ssh" ) +const ( + dockerConfigDir = "/etc/docker" +) + // Driver is a struct compatible with the docker.hosts.drivers.Driver interface. type Driver struct { MachineName string @@ -22,6 +26,8 @@ type Driver struct { storePath string UserName string Project string + CaCertPath string + PrivateKeyPath string sshKeyPath string publicSSHKeyPath string } @@ -72,10 +78,12 @@ func GetCreateFlags() []cli.Flag { } // NewDriver creates a Driver with the specified storePath. -func NewDriver(machineName string, storePath string) (drivers.Driver, error) { +func NewDriver(machineName string, storePath string, caCert string, privateKey string) (drivers.Driver, error) { return &Driver{ MachineName: machineName, storePath: storePath, + CaCertPath: caCert, + PrivateKeyPath: privateKey, sshKeyPath: path.Join(storePath, "id_rsa"), publicSSHKeyPath: path.Join(storePath, "id_rsa.pub"), }, nil @@ -225,6 +233,38 @@ func (driver *Driver) Kill() error { return driver.Stop() } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker stop") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + // GetSSHCommand returns a command that will run over SSH on the GCE instance. func (driver *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) { ip, err := driver.GetIP() diff --git a/drivers/none/none.go b/drivers/none/none.go index 45f02f5b5e..037b9900fc 100644 --- a/drivers/none/none.go +++ b/drivers/none/none.go @@ -34,7 +34,7 @@ func GetCreateFlags() []cli.Flag { } } -func NewDriver(machineName string, storePath string) (drivers.Driver, error) { +func NewDriver(machineName string, storePath string, caCert string, privateKey string) (drivers.Driver, error) { return &Driver{}, nil } @@ -93,6 +93,18 @@ func (d *Driver) Kill() error { return fmt.Errorf("hosts without a driver cannot be killed") } +func (d *Driver) StartDocker() error { + return fmt.Errorf("hosts without a driver cannot start docker") +} + +func (d *Driver) StopDocker() error { + return fmt.Errorf("hosts without a driver cannot stop docker") +} + +func (d *Driver) GetDockerConfigDir() string { + return "" +} + func (d *Driver) Upgrade() error { return fmt.Errorf("hosts without a driver cannot be upgraded") } diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index f287b3c6fe..4e6f776143 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -26,6 +26,10 @@ import ( "github.com/docker/machine/state" ) +const ( + dockerConfigDir = "/var/lib/boot2docker" +) + type Driver struct { MachineName string SSHPort int @@ -320,71 +324,50 @@ func (d *Driver) Create() error { return err } - log.Debugf("Adding key to authorized-keys.d...") + //log.Debugf("Adding key to authorized-keys.d...") - cmd, err := d.GetSSHCommand("sudo mkdir -p /var/lib/boot2docker/.docker && sudo chown -R docker /var/lib/boot2docker/.docker") - if err != nil { - return err - } - if err := cmd.Run(); err != nil { - return err - } + //cmd, err := d.GetSSHCommand("sudo mkdir -p /var/lib/boot2docker/.docker && sudo chown -R docker /var/lib/boot2docker/.docker") + //if err != nil { + // return err + //} + //if err := cmd.Run(); err != nil { + // return err + //} - if err := drivers.AddPublicKeyToAuthorizedHosts(d, "/var/lib/boot2docker/.docker/authorized-keys.d"); err != nil { - return err - } + //if err := drivers.AddPublicKeyToAuthorizedHosts(d, "/var/lib/boot2docker/.docker/authorized-keys.d"); err != nil { + // 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 { + // 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 { - return err - } - if err := cmd.Run(); err != nil { - return err - } + //extraArgs := `EXTRA_ARGS='--auth=identity + //--auth-authorized-dir=/var/lib/boot2docker/.docker/authorized-keys.d + //--auth-known-hosts=/var/lib/boot2docker/.docker/known-hosts.json + //--identity=/var/lib/boot2docker/.docker/key.json + //-H tcp://0.0.0.0:2376'` + //sshCmd := fmt.Sprintf("echo \"%s\" | sudo tee -a /var/lib/boot2docker/profile", extraArgs) + //cmd, err = d.GetSSHCommand(sshCmd) + //if err != nil { + // return err + //} + //if err := cmd.Run(); err != nil { + // return err + //} - extraArgs := `EXTRA_ARGS='--auth=identity - --auth-authorized-dir=/var/lib/boot2docker/.docker/authorized-keys.d - --auth-known-hosts=/var/lib/boot2docker/.docker/known-hosts.json - --identity=/var/lib/boot2docker/.docker/key.json - -H tcp://0.0.0.0:2376'` - sshCmd := fmt.Sprintf("echo \"%s\" | sudo tee -a /var/lib/boot2docker/profile", extraArgs) - cmd, err = d.GetSSHCommand(sshCmd) - if err != nil { - return err - } - if err := cmd.Run(); err != nil { - return err - } - - cmd, err = d.GetSSHCommand("sudo /etc/init.d/docker start") - if err != nil { - return err - } - if err := cmd.Run(); err != nil { - return err - } - - cmd, err = d.GetSSHCommand(fmt.Sprintf( - "sudo hostname %s && echo \"%s\" | sudo tee /var/lib/boot2docker/etc/hostname", - d.MachineName, - d.MachineName, - )) - - if err != nil { - return err - } - if err := cmd.Run(); err != nil { - return err - } + //cmd, err = d.GetSSHCommand("sudo /etc/init.d/docker restart") + //if err != nil { + // return err + //} + //if err := cmd.Run(); err != nil { + // return err + //} return nil } @@ -541,6 +524,38 @@ func (d *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) { return ssh.GetSSHCommand("localhost", d.SSHPort, "docker", d.sshKeyPath(), args...), nil } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker stop ; exit 0") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + func (d *Driver) sshKeyPath() string { return filepath.Join(d.storePath, "id_rsa") } diff --git a/drivers/vmwarefusion/fusion.go b/drivers/vmwarefusion/fusion.go index 5572d32e7c..3de31e63a7 100644 --- a/drivers/vmwarefusion/fusion.go +++ b/drivers/vmwarefusion/fusion.go @@ -26,8 +26,9 @@ import ( ) const ( - B2D_USER = "docker" - B2D_PASS = "tcuser" + B2D_USER = "docker" + B2D_PASS = "tcuser" + dockerConfigDir = "/var/lib/boot2docker" ) // Driver for VMware Fusion @@ -37,6 +38,8 @@ type Driver struct { DiskSize int ISO string Boot2DockerURL string + CaCertPath string + PrivateKeyPath string storePath string } @@ -78,8 +81,8 @@ func GetCreateFlags() []cli.Flag { } } -func NewDriver(machineName string, storePath string) (drivers.Driver, error) { - return &Driver{MachineName: machineName, storePath: storePath}, nil +func NewDriver(machineName string, storePath string, caCert string, privateKey string) (drivers.Driver, error) { + return &Driver{MachineName: machineName, storePath: storePath, CaCertPath: caCert, PrivateKeyPath: privateKey}, nil } func (d *Driver) DriverName() string { @@ -229,6 +232,13 @@ func (d *Driver) Create() error { if err := cmd.Run(); err != nil { return err } + //cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker restart; sleep 5") + //if err != nil { + // return err + //} + //if err := cmd.Run(); err != nil { + // return err + //} return nil } @@ -266,6 +276,38 @@ func (d *Driver) Kill() error { return nil } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker stop ; exit 0") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + func (d *Driver) Upgrade() error { return nil } diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index 07e47d9b2b..59ee893e69 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -23,6 +23,10 @@ import ( "github.com/docker/machine/state" ) +const ( + dockerConfigDir = "/etc/docker" +) + type Driver struct { UserName string UserPassword string @@ -750,6 +754,38 @@ func (d *Driver) Kill() error { } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo service docker stop") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + func (d *Driver) Upgrade() error { // Stolen from DigitalOcean ;-) sshCmd, err := d.GetSSHCommand("apt-get update && apt-get install lxc-docker") diff --git a/drivers/vmwarevsphere/vsphere.go b/drivers/vmwarevsphere/vsphere.go index 4cd69e6297..4307d2a713 100644 --- a/drivers/vmwarevsphere/vsphere.go +++ b/drivers/vmwarevsphere/vsphere.go @@ -28,6 +28,7 @@ const ( DATASTORE_DIR = "boot2docker-iso" B2D_ISO_NAME = "boot2docker.iso" DEFAULT_CPU_NUMBER = 2 + dockerConfigDir = "/var/lib/boot2docker" ) type Driver struct { @@ -379,6 +380,38 @@ func (d *Driver) Kill() error { return d.Stop() } +func (d *Driver) StartDocker() error { + log.Debug("Starting Docker...") + + cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker start") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) StopDocker() error { + log.Debug("Stopping Docker...") + + cmd, err := d.GetSSHCommand("sudo /etc/init.d/docker stop") + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +func (d *Driver) GetDockerConfigDir() string { + return dockerConfigDir +} + func (d *Driver) Upgrade() error { return fmt.Errorf("upgrade is not supported for vsphere driver at this moment") } diff --git a/host.go b/host.go index 734dc82b00..dbdee0ac41 100644 --- a/host.go +++ b/host.go @@ -156,15 +156,11 @@ func (h *Host) ConfigureAuth() error { caCertPath := filepath.Join(h.storePath, "ca.pem") serverKeyPath := filepath.Join(h.storePath, "server-key.pem") - cmd, err := d.GetSSHCommand("sudo stop docker") - if err != nil { - return err - } - if err := cmd.Run(); err != nil { + if err := d.StopDocker(); err != nil { return err } - cmd, err = d.GetSSHCommand("sudo mkdir -p /etc/docker") + cmd, err := d.GetSSHCommand(fmt.Sprintf("sudo mkdir -p %s", d.GetDockerConfigDir())) if err != nil { return err } @@ -177,18 +173,21 @@ func (h *Host) ConfigureAuth() error { if err != nil { return err } + machineCaCertPath := filepath.Join(d.GetDockerConfigDir(), "ca.pem") serverCert, err := ioutil.ReadFile(serverCertPath) if err != nil { return err } + machineServerCertPath := filepath.Join(d.GetDockerConfigDir(), "server.pem") serverKey, err := ioutil.ReadFile(serverKeyPath) if err != nil { return err } + machineServerKeyPath := filepath.Join(d.GetDockerConfigDir(), "server-key.pem") - cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a /etc/docker/ca.pem", string(caCert))) + cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a %s", string(caCert), machineCaCertPath)) if err != nil { return err } @@ -196,7 +195,7 @@ func (h *Host) ConfigureAuth() error { return err } - cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a /etc/docker/server-key.pem", string(serverKey))) + cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a %s", string(serverKey), machineServerKeyPath)) if err != nil { return err } @@ -204,7 +203,7 @@ func (h *Host) ConfigureAuth() error { return err } - cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a /etc/docker/server.pem", string(serverCert))) + cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a %s", string(serverCert), machineServerCertPath)) if err != nil { return err } @@ -212,12 +211,28 @@ func (h *Host) ConfigureAuth() error { return err } - cmd, err = d.GetSSHCommand(`echo 'export DOCKER_OPTS=" \ + daemonOpts := fmt.Sprintf(`--tlsverify \ --tlsverify \ - --tlscacert=/etc/docker/ca.pem \ - --tlskey=/etc/docker/server-key.pem \ - --tlscert=/etc/docker/server.pem \ - --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376"' | sudo tee -a /etc/default/docker`) + --tlscacert=%s \ + --tlskey=%s \ + --tlscert=%s \ + --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376`, machineCaCertPath, + machineServerKeyPath, machineServerCertPath) + + var ( + daemonOptsCfg string + daemonCfg string + ) + + switch d.DriverName() { + case "virtualbox", "vmwarefusion", "vmwarevsphere": + daemonOptsCfg = filepath.Join(d.GetDockerConfigDir(), "profile") + daemonCfg = fmt.Sprintf("EXTRA_ARGS='%s'", daemonOpts) + default: + daemonOptsCfg = "/etc/default/docker" + daemonCfg = fmt.Sprintf("export DOCKER_OPTS='%s'", daemonOpts) + } + cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a %s", daemonCfg, daemonOptsCfg)) if err != nil { return err } @@ -225,11 +240,7 @@ func (h *Host) ConfigureAuth() error { return err } - cmd, err = d.GetSSHCommand("sudo start docker") - if err != nil { - return err - } - if err := cmd.Run(); err != nil { + if err := d.StartDocker(); err != nil { return err }