diff --git a/api/client/cli.go b/api/client/cli.go index 6bc3fc3507..70eae6e4b4 100644 --- a/api/client/cli.go +++ b/api/client/cli.go @@ -5,10 +5,13 @@ import ( "encoding/json" "fmt" "io" + "net" + "net/http" "os" "reflect" "strings" "text/template" + "time" flag "github.com/docker/docker/pkg/mflag" "github.com/docker/docker/pkg/term" @@ -34,6 +37,7 @@ type DockerCli struct { isTerminalIn bool // isTerminalOut describes if client's STDOUT is a TTY isTerminalOut bool + transport *http.Transport } var funcMap = template.FuncMap{ @@ -131,6 +135,19 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, key libtrust.PrivateKey, err = out } + // The transport is created here for reuse during the client session + tr := &http.Transport{ + TLSClientConfig: tlsConfig, + Dial: func(dial_network, dial_addr string) (net.Conn, error) { + // Why 32? See issue 8035 + return net.DialTimeout(proto, addr, 32*time.Second) + }, + } + if proto == "unix" { + // no need in compressing for local communications + tr.DisableCompression = true + } + return &DockerCli{ proto: proto, addr: addr, @@ -144,5 +161,6 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, key libtrust.PrivateKey, isTerminalOut: isTerminalOut, tlsConfig: tlsConfig, scheme: scheme, + transport: tr, } } diff --git a/api/client/utils.go b/api/client/utils.go index 58b730bd1b..11e39729af 100644 --- a/api/client/utils.go +++ b/api/client/utils.go @@ -8,7 +8,6 @@ import ( "fmt" "io" "io/ioutil" - "net" "net/http" "net/url" "os" @@ -16,7 +15,6 @@ import ( "strconv" "strings" "syscall" - "time" "github.com/docker/docker/api" "github.com/docker/docker/dockerversion" @@ -33,22 +31,7 @@ var ( ) func (cli *DockerCli) HTTPClient() *http.Client { - tr := &http.Transport{ - TLSClientConfig: cli.tlsConfig, - Dial: func(network, addr string) (net.Conn, error) { - // Why 32? See issue 8035 - return net.DialTimeout(cli.proto, cli.addr, 32*time.Second) - }, - } - if cli.proto == "unix" { - // XXX workaround for net/http Transport which caches connections, but is - // intended for tcp connections, not unix sockets. - tr.DisableKeepAlives = true - - // no need in compressing for local communications - tr.DisableCompression = true - } - return &http.Client{Transport: tr} + return &http.Client{Transport: cli.transport} } func (cli *DockerCli) encodeData(data interface{}) (*bytes.Buffer, error) {