mirror of https://github.com/docker/docs.git
fixes #282: use port from driver URL when configuring engine
Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
parent
9178f518e8
commit
a3e114737b
93
host.go
93
host.go
|
@ -6,9 +6,12 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
|
@ -34,6 +37,11 @@ type Host struct {
|
||||||
storePath string
|
storePath string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DockerConfig struct {
|
||||||
|
EngineConfig string
|
||||||
|
EngineConfigPath string
|
||||||
|
}
|
||||||
|
|
||||||
type hostConfig struct {
|
type hostConfig struct {
|
||||||
DriverName string
|
DriverName string
|
||||||
}
|
}
|
||||||
|
@ -220,35 +228,27 @@ func (h *Host) ConfigureAuth() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
dockerUrl, err := h.Driver.GetURL()
|
||||||
daemonOpts string
|
if err != nil {
|
||||||
daemonOptsCfg string
|
return err
|
||||||
daemonCfg string
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO @ehazlett: template?
|
|
||||||
defaultDaemonOpts := fmt.Sprintf(`--tlsverify \
|
|
||||||
--tlscacert=%s \
|
|
||||||
--tlskey=%s \
|
|
||||||
--tlscert=%s`, machineCaCertPath, machineServerKeyPath, machineServerCertPath)
|
|
||||||
|
|
||||||
switch d.DriverName() {
|
|
||||||
case "virtualbox", "vmwarefusion", "vmwarevsphere":
|
|
||||||
daemonOpts = "-H tcp://0.0.0.0:2376"
|
|
||||||
daemonOptsCfg = filepath.Join(d.GetDockerConfigDir(), "profile")
|
|
||||||
opts := fmt.Sprintf("%s %s", defaultDaemonOpts, daemonOpts)
|
|
||||||
daemonCfg = fmt.Sprintf(`EXTRA_ARGS='%s'
|
|
||||||
CACERT=%s
|
|
||||||
SERVERCERT=%s
|
|
||||||
SERVERKEY=%s
|
|
||||||
DOCKER_TLS=no`, opts, machineCaCertPath, machineServerCertPath, machineServerKeyPath)
|
|
||||||
default:
|
|
||||||
daemonOpts = "--host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376"
|
|
||||||
daemonOptsCfg = "/etc/default/docker"
|
|
||||||
opts := fmt.Sprintf("%s %s", defaultDaemonOpts, daemonOpts)
|
|
||||||
daemonCfg = fmt.Sprintf("export DOCKER_OPTS='%s'", opts)
|
|
||||||
}
|
}
|
||||||
cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a %s", daemonCfg, daemonOptsCfg))
|
u, err := url.Parse(dockerUrl)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dockerPort := 2376
|
||||||
|
parts := strings.Split(u.Host, ":")
|
||||||
|
if len(parts) == 2 {
|
||||||
|
dPort, err := strconv.Atoi(parts[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dockerPort = dPort
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := h.generateDockerConfig(dockerPort, machineCaCertPath, machineServerKeyPath, machineServerCertPath)
|
||||||
|
|
||||||
|
cmd, err = d.GetSSHCommand(fmt.Sprintf("echo \"%s\" | sudo tee -a %s", cfg.EngineConfig, cfg.EngineConfigPath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -263,6 +263,43 @@ DOCKER_TLS=no`, opts, machineCaCertPath, machineServerCertPath, machineServerKey
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Host) generateDockerConfig(dockerPort int, caCertPath string, serverKeyPath string, serverCertPath string) *DockerConfig {
|
||||||
|
d := h.Driver
|
||||||
|
var (
|
||||||
|
daemonOpts string
|
||||||
|
daemonOptsCfg string
|
||||||
|
daemonCfg string
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO @ehazlett: template?
|
||||||
|
defaultDaemonOpts := fmt.Sprintf(`--tlsverify \
|
||||||
|
--tlscacert=%s \
|
||||||
|
--tlskey=%s \
|
||||||
|
--tlscert=%s`, caCertPath, serverKeyPath, serverCertPath)
|
||||||
|
|
||||||
|
switch d.DriverName() {
|
||||||
|
case "virtualbox", "vmwarefusion", "vmwarevsphere":
|
||||||
|
daemonOpts = fmt.Sprintf("-H tcp://0.0.0.0:%d", dockerPort)
|
||||||
|
daemonOptsCfg = filepath.Join(d.GetDockerConfigDir(), "profile")
|
||||||
|
opts := fmt.Sprintf("%s %s", defaultDaemonOpts, daemonOpts)
|
||||||
|
daemonCfg = fmt.Sprintf(`EXTRA_ARGS='%s'
|
||||||
|
CACERT=%s
|
||||||
|
SERVERCERT=%s
|
||||||
|
SERVERKEY=%s
|
||||||
|
DOCKER_TLS=no`, opts, caCertPath, serverKeyPath, serverCertPath)
|
||||||
|
default:
|
||||||
|
daemonOpts = fmt.Sprintf("--host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:%d", dockerPort)
|
||||||
|
daemonOptsCfg = "/etc/default/docker"
|
||||||
|
opts := fmt.Sprintf("%s %s", defaultDaemonOpts, daemonOpts)
|
||||||
|
daemonCfg = fmt.Sprintf("export DOCKER_OPTS='%s'", opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &DockerConfig{
|
||||||
|
EngineConfig: daemonCfg,
|
||||||
|
EngineConfigPath: daemonOptsCfg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Host) Create(name string) error {
|
func (h *Host) Create(name string) error {
|
||||||
name, err := ValidateHostName(name)
|
name, err := ValidateHostName(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
81
host_test.go
81
host_test.go
|
@ -1,7 +1,12 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
_ "github.com/docker/machine/drivers/none"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidateHostnameValid(t *testing.T) {
|
func TestValidateHostnameValid(t *testing.T) {
|
||||||
|
@ -37,3 +42,79 @@ func TestValidateHostnameInvalid(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMachinePort(t *testing.T) {
|
||||||
|
dockerPort := 2376
|
||||||
|
bindUrl := fmt.Sprintf("tcp://0.0.0.0:%d", dockerPort)
|
||||||
|
flags := &DriverOptionsMock{
|
||||||
|
Data: map[string]interface{}{
|
||||||
|
"url": bindUrl,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
store := NewStore("", "", "")
|
||||||
|
|
||||||
|
_, err := store.Create("test", "none", flags)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
host, err := store.Load("test")
|
||||||
|
cfg := host.generateDockerConfig(dockerPort, "", "", "")
|
||||||
|
|
||||||
|
re := regexp.MustCompile("--host=tcp://.*:(.+)")
|
||||||
|
m := re.FindStringSubmatch(cfg.EngineConfig)
|
||||||
|
if len(m) == 0 {
|
||||||
|
t.Errorf("could not find port %d in engine config", dockerPort)
|
||||||
|
}
|
||||||
|
|
||||||
|
b := m[0]
|
||||||
|
u := strings.Split(b, "=")
|
||||||
|
url := u[1]
|
||||||
|
url = strings.Replace(url, "'", "", -1)
|
||||||
|
if url != bindUrl {
|
||||||
|
t.Errorf("expected url %s; received %s", bindUrl, url)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := store.Remove("test", true); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMachineCustomPort(t *testing.T) {
|
||||||
|
dockerPort := 3376
|
||||||
|
bindUrl := fmt.Sprintf("tcp://0.0.0.0:%d", dockerPort)
|
||||||
|
flags := &DriverOptionsMock{
|
||||||
|
Data: map[string]interface{}{
|
||||||
|
"url": bindUrl,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
store := NewStore("", "", "")
|
||||||
|
|
||||||
|
_, err := store.Create("test", "none", flags)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
host, err := store.Load("test")
|
||||||
|
cfg := host.generateDockerConfig(dockerPort, "", "", "")
|
||||||
|
|
||||||
|
re := regexp.MustCompile("--host=tcp://.*:(.+)")
|
||||||
|
m := re.FindStringSubmatch(cfg.EngineConfig)
|
||||||
|
if len(m) == 0 {
|
||||||
|
t.Errorf("could not find port %d in engine config", dockerPort)
|
||||||
|
}
|
||||||
|
|
||||||
|
b := m[0]
|
||||||
|
u := strings.Split(b, "=")
|
||||||
|
url := u[1]
|
||||||
|
url = strings.Replace(url, "'", "", -1)
|
||||||
|
if url != bindUrl {
|
||||||
|
t.Errorf("expected url %s; received %s", bindUrl, url)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := store.Remove("test", true); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue