// Client returns a Docker client for the given Docker machine func Client(name string) (*docker.Client, error) { output, _, err := localcmd.New(dockerMachineBinary()).Args("env", name).Output() if err != nil { return nil, ErrDockerMachineExec("env", err) } scanner := bufio.NewScanner(bytes.NewBufferString(output)) var ( dockerHost, certPath string tlsVerify bool ) prefix := "export " if runtime.GOOS == "windows" { prefix = "SET " } for scanner.Scan() { line := scanner.Text() if strings.HasPrefix(line, prefix) { line = strings.TrimPrefix(line, prefix) parts := strings.SplitN(line, "=", 2) if len(parts) != 2 { continue } switch strings.ToUpper(parts[0]) { case "DOCKER_HOST": dockerHost = strings.Trim(parts[1], "\"") case "DOCKER_CERT_PATH": certPath = strings.Trim(parts[1], "\"") case "DOCKER_TLS_VERIFY": tlsVerify = len(parts[1]) > 0 } } } var client *docker.Client if tlsVerify { cert := filepath.Join(certPath, "cert.pem") key := filepath.Join(certPath, "key.pem") ca := filepath.Join(certPath, "ca.pem") client, err = docker.NewVersionedTLSClient(dockerHost, cert, key, ca, "") } else { client, err = docker.NewVersionedClient(dockerHost, "") } if err != nil { return nil, errors.NewError("could not get Docker client for machine %s", name).WithCause(err) } client.SkipServerVersionCheck = true return client, nil }
// Docker generates a docker client func Docker() (client *Client, err error) { var c *api.Client if misc.ZeroOrNil(current.CertPath) { c, err = api.NewClient(current.Endpoint) } else { cert := fmt.Sprintf("%s/cert.pem", current.CertPath) // X.509 Certificate key := fmt.Sprintf("%s/key.pem", current.CertPath) // Private Key ca := fmt.Sprintf("%s/ca.pem", current.CertPath) // Certificate authority c, err = api.NewTLSClient(current.Endpoint, cert, key, ca) } if !misc.ZeroOrNil(c) { err = c.Ping() } if misc.ZeroOrNil(err) { c.SkipServerVersionCheck = true return &Client{c, current}, nil } return nil, err }
// Client returns a Docker client for the given Docker machine func Client(name string) (*docker.Client, *dockerclient.Client, error) { output, _, err := localcmd.New(dockerMachineBinary()).Args("env", name).Output() if err != nil { return nil, nil, ErrDockerMachineExec("env", err) } scanner := bufio.NewScanner(bytes.NewBufferString(output)) var ( dockerHost, certPath string tlsVerify bool ) prefix := "export " if runtime.GOOS == "windows" { prefix = "SET " } for scanner.Scan() { line := scanner.Text() if strings.HasPrefix(line, prefix) { line = strings.TrimPrefix(line, prefix) parts := strings.SplitN(line, "=", 2) if len(parts) != 2 { continue } switch strings.ToUpper(parts[0]) { case "DOCKER_HOST": dockerHost = strings.Trim(parts[1], "\"") case "DOCKER_CERT_PATH": certPath = strings.Trim(parts[1], "\"") case "DOCKER_TLS_VERIFY": tlsVerify = len(parts[1]) > 0 } } } var client *docker.Client if len(certPath) > 0 { cert := filepath.Join(certPath, "cert.pem") key := filepath.Join(certPath, "key.pem") ca := filepath.Join(certPath, "ca.pem") client, err = docker.NewVersionedTLSClient(dockerHost, cert, key, ca, "") } else { client, err = docker.NewVersionedClient(dockerHost, "") } if err != nil { return nil, nil, errors.NewError("could not get Docker client for machine %s", name).WithCause(err) } client.SkipServerVersionCheck = true var httpClient *http.Client if len(certPath) > 0 { tlscOptions := tlsconfig.Options{ CAFile: filepath.Join(certPath, "ca.pem"), CertFile: filepath.Join(certPath, "cert.pem"), KeyFile: filepath.Join(certPath, "key.pem"), InsecureSkipVerify: !tlsVerify, } tlsc, tlsErr := tlsconfig.Client(tlscOptions) if tlsErr != nil { return nil, nil, errors.NewError("could not create TLS config client for machine %s", name).WithCause(tlsErr) } httpClient = &http.Client{ Transport: net.SetTransportDefaults(&http.Transport{ TLSClientConfig: tlsc, }), } } engineAPIClient, err := dockerclient.NewClient(dockerHost, "", httpClient, nil) if err != nil { return nil, nil, errors.NewError("cannot create Docker engine API client").WithCause(err) } return client, engineAPIClient, nil }