diff --git a/cli/command/cli.go b/cli/command/cli.go index 9314af629d..2e051440fd 100644 --- a/cli/command/cli.go +++ b/cli/command/cli.go @@ -274,21 +274,17 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, isTrusted bool, containe // NewAPIClientFromFlags creates a new APIClient from command line flags func NewAPIClientFromFlags(opts *cliflags.CommonOptions, configFile *configfile.ConfigFile) (client.APIClient, error) { - unparsedHost, err := getUnparsedServerHost(opts.Hosts) + host, err := getServerHost(opts.Hosts, opts.TLSOptions) if err != nil { return &client.Client{}, err } var clientOpts []func(*client.Client) error - helper, err := connhelper.GetConnectionHelper(unparsedHost) + helper, err := connhelper.GetConnectionHelper(host) if err != nil { return &client.Client{}, err } if helper == nil { clientOpts = append(clientOpts, withHTTPClient(opts.TLSOptions)) - host, err := dopts.ParseHost(opts.TLSOptions != nil, unparsedHost) - if err != nil { - return &client.Client{}, err - } clientOpts = append(clientOpts, client.WithHost(host)) } else { clientOpts = append(clientOpts, func(c *client.Client) error { @@ -321,7 +317,7 @@ func NewAPIClientFromFlags(opts *cliflags.CommonOptions, configFile *configfile. return client.NewClientWithOpts(clientOpts...) } -func getUnparsedServerHost(hosts []string) (string, error) { +func getServerHost(hosts []string, tlsOptions *tlsconfig.Options) (string, error) { var host string switch len(hosts) { case 0: @@ -331,7 +327,8 @@ func getUnparsedServerHost(hosts []string) (string, error) { default: return "", errors.New("Please specify only one -H") } - return host, nil + + return dopts.ParseHost(tlsOptions != nil, host) } func withHTTPClient(tlsOpts *tlsconfig.Options) func(*client.Client) error { diff --git a/cli/command/cli_test.go b/cli/command/cli_test.go index a4b06e6997..6ac120fa22 100644 --- a/cli/command/cli_test.go +++ b/cli/command/cli_test.go @@ -43,6 +43,26 @@ func TestNewAPIClientFromFlags(t *testing.T) { assert.Check(t, is.Equal(api.DefaultVersion, apiclient.ClientVersion())) } +func TestNewAPIClientFromFlagsForDefaultSchema(t *testing.T) { + host := ":2375" + opts := &flags.CommonOptions{Hosts: []string{host}} + configFile := &configfile.ConfigFile{ + HTTPHeaders: map[string]string{ + "My-Header": "Custom-Value", + }, + } + apiclient, err := NewAPIClientFromFlags(opts, configFile) + assert.NilError(t, err) + assert.Check(t, is.Equal("tcp://localhost"+host, apiclient.DaemonHost())) + + expectedHeaders := map[string]string{ + "My-Header": "Custom-Value", + "User-Agent": UserAgent(), + } + assert.Check(t, is.DeepEqual(expectedHeaders, apiclient.(*client.Client).CustomHTTPHeaders())) + assert.Check(t, is.Equal(api.DefaultVersion, apiclient.ClientVersion())) +} + func TestNewAPIClientFromFlagsWithAPIVersionFromEnv(t *testing.T) { customVersion := "v3.3.3" defer env.Patch(t, "DOCKER_API_VERSION", customVersion)() diff --git a/opts/hosts.go b/opts/hosts.go index 594cccf2fb..408bc24a06 100644 --- a/opts/hosts.go +++ b/opts/hosts.go @@ -77,6 +77,8 @@ func parseDockerDaemonHost(addr string) (string, error) { return parseSimpleProtoAddr("npipe", addrParts[1], DefaultNamedPipe) case "fd": return addr, nil + case "ssh": + return addr, nil default: return "", fmt.Errorf("Invalid bind address format: %s", addr) }