mirror of https://github.com/docker/docs.git
109 lines
2.7 KiB
Go
109 lines
2.7 KiB
Go
package provision
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/docker/machine/libmachine/auth"
|
|
"github.com/docker/machine/libmachine/log"
|
|
"github.com/docker/machine/libmachine/mcndockerclient"
|
|
"github.com/docker/machine/libmachine/swarm"
|
|
"github.com/samalba/dockerclient"
|
|
)
|
|
|
|
func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth.Options) error {
|
|
if !swarmOptions.IsSwarm {
|
|
return nil
|
|
}
|
|
|
|
log.Info("Configuring swarm...")
|
|
|
|
ip, err := p.GetDriver().GetIP()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
u, err := url.Parse(swarmOptions.Host)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
parts := strings.Split(u.Host, ":")
|
|
port := parts[1]
|
|
|
|
dockerPort := "2376"
|
|
dockerDir := p.GetDockerOptionsDir()
|
|
dockerHost := fmt.Sprintf("tcp://%s:%s", ip, dockerPort)
|
|
dockerClient := mcndockerclient.RemoteDocker{dockerHost, &authOptions}
|
|
advertiseInfo := fmt.Sprintf("%s:%s", ip, dockerPort)
|
|
|
|
if swarmOptions.Master {
|
|
cmd := fmt.Sprintf("manage --tlsverify --tlscacert=%s --tlscert=%s --tlskey=%s -H %s --strategy %s --advertise %s",
|
|
authOptions.CaCertRemotePath,
|
|
authOptions.ServerCertRemotePath,
|
|
authOptions.ServerKeyRemotePath,
|
|
swarmOptions.Host,
|
|
swarmOptions.Strategy,
|
|
advertiseInfo,
|
|
)
|
|
|
|
cmdMaster := strings.Fields(cmd)
|
|
for _, option := range swarmOptions.ArbitraryFlags {
|
|
cmdMaster = append(cmdMaster, "--"+option)
|
|
}
|
|
|
|
//Discovery must be at end of command
|
|
cmdMaster = append(cmdMaster, swarmOptions.Discovery)
|
|
|
|
hostBind := fmt.Sprintf("%s:%s", dockerDir, dockerDir)
|
|
masterHostConfig := dockerclient.HostConfig{
|
|
RestartPolicy: dockerclient.RestartPolicy{
|
|
Name: "Always",
|
|
MaximumRetryCount: 0,
|
|
},
|
|
Binds: []string{hostBind},
|
|
PortBindings: map[string][]dockerclient.PortBinding{"3376/tcp": {{"", port}}},
|
|
NetworkMode: "host",
|
|
}
|
|
|
|
swarmMasterConfig := &dockerclient.ContainerConfig{
|
|
Image: swarmOptions.Image,
|
|
Env: swarmOptions.Env,
|
|
ExposedPorts: map[string]struct{}{
|
|
"2375/tcp": {},
|
|
"3376/tcp": {},
|
|
},
|
|
Cmd: cmdMaster,
|
|
HostConfig: masterHostConfig,
|
|
}
|
|
|
|
err = mcndockerclient.CreateContainer(dockerClient, swarmMasterConfig, "swarm-agent-master")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
workerHostConfig := dockerclient.HostConfig{
|
|
RestartPolicy: dockerclient.RestartPolicy{
|
|
Name: "Always",
|
|
MaximumRetryCount: 0,
|
|
},
|
|
NetworkMode: "host",
|
|
}
|
|
|
|
swarmWorkerConfig := &dockerclient.ContainerConfig{
|
|
Image: swarmOptions.Image,
|
|
Env: swarmOptions.Env,
|
|
Cmd: []string{
|
|
"join",
|
|
"--advertise",
|
|
advertiseInfo,
|
|
swarmOptions.Discovery,
|
|
},
|
|
HostConfig: workerHostConfig,
|
|
}
|
|
|
|
return mcndockerclient.CreateContainer(dockerClient, swarmWorkerConfig, "swarm-agent")
|
|
}
|