Skip to content
Snippets Groups Projects
Commit 02f85e4f authored by Arran Walker's avatar Arran Walker
Browse files

Use official Docker client

parent c48e05e6
Branches
Tags
No related merge requests found
package mcndockerclient package mcndockerclient
import ( import (
"context"
"fmt" "fmt"
"net/http"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
"github.com/docker/machine/libmachine/cert" "github.com/docker/machine/libmachine/cert"
"github.com/samalba/dockerclient" v1 "github.com/opencontainers/image-spec/specs-go/v1"
) )
// DockerClient creates a docker client for a given host. // DockerClient creates a docker client for a given host.
func DockerClient(dockerHost DockerHost) (*dockerclient.DockerClient, error) { func DockerClient(dockerHost DockerHost) (*client.Client, error) {
url, err := dockerHost.URL() url, err := dockerHost.URL()
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -19,27 +25,35 @@ func DockerClient(dockerHost DockerHost) (*dockerclient.DockerClient, error) { ...@@ -19,27 +25,35 @@ func DockerClient(dockerHost DockerHost) (*dockerclient.DockerClient, error) {
return nil, fmt.Errorf("Unable to read TLS config: %s", err) return nil, fmt.Errorf("Unable to read TLS config: %s", err)
} }
return dockerclient.NewDockerClient(url, tlsConfig) httpClient := &http.Client{
Transport: &http.Transport{TLSClientConfig: tlsConfig},
CheckRedirect: client.CheckRedirect,
}
return client.NewClientWithOpts(
client.WithHTTPClient(httpClient),
client.WithHost(url),
client.WithAPIVersionNegotiation(),
)
} }
// CreateContainer creates a docker container. // CreateContainer creates a docker container.
func CreateContainer(dockerHost DockerHost, config *dockerclient.ContainerConfig, name string) error { func CreateContainer(dockerHost DockerHost, config *container.Config, hostConfig *container.HostConfig, name string) error {
docker, err := DockerClient(dockerHost) docker, err := DockerClient(dockerHost)
if err != nil { if err != nil {
return err return err
} }
if err = docker.PullImage(config.Image, nil); err != nil { if _, err = docker.ImagePull(context.Background(), config.Image, types.ImagePullOptions{}); err != nil {
return fmt.Errorf("Unable to pull image: %s", err) return fmt.Errorf("Unable to pull image: %s", err)
} }
var authConfig *dockerclient.AuthConfig containerCreateResp, err := docker.ContainerCreate(context.Background(), config, hostConfig, &network.NetworkingConfig{}, &v1.Platform{}, name)
containerID, err := docker.CreateContainer(config, name, authConfig)
if err != nil { if err != nil {
return fmt.Errorf("Error while creating container: %s", err) return fmt.Errorf("Error while creating container: %s", err)
} }
if err = docker.StartContainer(containerID, &config.HostConfig); err != nil { if err = docker.ContainerStart(context.Background(), containerCreateResp.ID, types.ContainerStartOptions{}); err != nil {
return fmt.Errorf("Error while starting container: %s", err) return fmt.Errorf("Error while starting container: %s", err)
} }
......
package mcndockerclient package mcndockerclient
import "fmt" import (
"context"
"fmt"
)
var CurrentDockerVersioner DockerVersioner = &defaultDockerVersioner{} var CurrentDockerVersioner DockerVersioner = &defaultDockerVersioner{}
...@@ -20,7 +23,7 @@ func (dv *defaultDockerVersioner) DockerVersion(host DockerHost) (string, error) ...@@ -20,7 +23,7 @@ func (dv *defaultDockerVersioner) DockerVersion(host DockerHost) (string, error)
return "", fmt.Errorf("Unable to query docker version: %s", err) return "", fmt.Errorf("Unable to query docker version: %s", err)
} }
version, err := client.Version() version, err := client.ServerVersion(context.Background())
if err != nil { if err != nil {
return "", fmt.Errorf("Unable to query docker version: %s", err) return "", fmt.Errorf("Unable to query docker version: %s", err)
} }
......
...@@ -6,12 +6,13 @@ import ( ...@@ -6,12 +6,13 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/docker/docker/api/types/container"
"github.com/docker/go-connections/nat"
"github.com/docker/machine/libmachine/auth" "github.com/docker/machine/libmachine/auth"
"github.com/docker/machine/libmachine/engine" "github.com/docker/machine/libmachine/engine"
"github.com/docker/machine/libmachine/log" "github.com/docker/machine/libmachine/log"
"github.com/docker/machine/libmachine/mcndockerclient" "github.com/docker/machine/libmachine/mcndockerclient"
"github.com/docker/machine/libmachine/swarm" "github.com/docker/machine/libmachine/swarm"
"github.com/samalba/dockerclient"
) )
func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth.Options) error { func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth.Options) error {
...@@ -79,42 +80,41 @@ func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth. ...@@ -79,42 +80,41 @@ func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth.
cmdMaster = append(cmdMaster, swarmOptions.Discovery) cmdMaster = append(cmdMaster, swarmOptions.Discovery)
hostBind := fmt.Sprintf("%s:%s", dockerDir, dockerDir) hostBind := fmt.Sprintf("%s:%s", dockerDir, dockerDir)
masterHostConfig := dockerclient.HostConfig{ masterHostConfig := &container.HostConfig{
RestartPolicy: dockerclient.RestartPolicy{ RestartPolicy: container.RestartPolicy{
Name: "always", Name: "always",
MaximumRetryCount: 0, MaximumRetryCount: 0,
}, },
Binds: []string{hostBind}, Binds: []string{hostBind},
PortBindings: map[string][]dockerclient.PortBinding{ PortBindings: nat.PortMap{
fmt.Sprintf("%s/tcp", port): { nat.Port(fmt.Sprintf("%s/tcp", port)): {
{ {
HostIp: "0.0.0.0", HostIP: "0.0.0.0",
HostPort: port, HostPort: port,
}, },
}, },
}, },
} }
swarmMasterConfig := &dockerclient.ContainerConfig{ swarmMasterConfig := &container.Config{
Image: swarmOptions.Image, Image: swarmOptions.Image,
Env: swarmOptions.Env, Env: swarmOptions.Env,
ExposedPorts: map[string]struct{}{ ExposedPorts: nat.PortSet{
"2375/tcp": {}, "2375/tcp": {},
fmt.Sprintf("%s/tcp", port): {}, nat.Port(fmt.Sprintf("%s/tcp", port)): {},
}, },
Cmd: cmdMaster, Cmd: cmdMaster,
HostConfig: masterHostConfig,
} }
err = mcndockerclient.CreateContainer(dockerHost, swarmMasterConfig, "swarm-agent-master") err = mcndockerclient.CreateContainer(dockerHost, swarmMasterConfig, masterHostConfig, "swarm-agent-master")
if err != nil { if err != nil {
return err return err
} }
} }
if swarmOptions.Agent { if swarmOptions.Agent {
workerHostConfig := dockerclient.HostConfig{ workerHostConfig := &container.HostConfig{
RestartPolicy: dockerclient.RestartPolicy{ RestartPolicy: container.RestartPolicy{
Name: "always", Name: "always",
MaximumRetryCount: 0, MaximumRetryCount: 0,
}, },
...@@ -130,17 +130,16 @@ func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth. ...@@ -130,17 +130,16 @@ func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth.
} }
cmdWorker = append(cmdWorker, swarmOptions.Discovery) cmdWorker = append(cmdWorker, swarmOptions.Discovery)
swarmWorkerConfig := &dockerclient.ContainerConfig{ swarmWorkerConfig := &container.Config{
Image: swarmOptions.Image, Image: swarmOptions.Image,
Env: swarmOptions.Env, Env: swarmOptions.Env,
Cmd: cmdWorker, Cmd: cmdWorker,
HostConfig: workerHostConfig,
} }
if swarmOptions.IsExperimental { if swarmOptions.IsExperimental {
swarmWorkerConfig.Cmd = append([]string{"--experimental"}, swarmWorkerConfig.Cmd...) swarmWorkerConfig.Cmd = append([]string{"--experimental"}, swarmWorkerConfig.Cmd...)
} }
err = mcndockerclient.CreateContainer(dockerHost, swarmWorkerConfig, "swarm-agent") err = mcndockerclient.CreateContainer(dockerHost, swarmWorkerConfig, workerHostConfig, "swarm-agent")
if err != nil { if err != nil {
return err return err
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment