From 207027087e71f5587ca407e20cc252f7958bc1b3 Mon Sep 17 00:00:00 2001 From: Brett Higgins Date: Mon, 25 Apr 2016 07:54:48 -0400 Subject: [PATCH] Respect ALL_PROXY during registry operations Use sockets.DialerFromEnvironment, as is done in other places, to transparently support SOCKS proxy config from ALL_PROXY environment variable. Requires the *engine* have the ALL_PROXY env var set, which doesn't seem ideal. Maybe it should be a CLI option somehow? Only tested with push and a v2 registry so far. I'm happy to look further into testing more broadly, but I wanted to get feedback on the general idea first. Signed-off-by: Brett Higgins --- distribution/registry.go | 20 ++++++++++++++------ registry/registry.go | 24 +++++++++++++++++------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/distribution/registry.go b/distribution/registry.go index f768a14d86..7366a4dd1e 100644 --- a/distribution/registry.go +++ b/distribution/registry.go @@ -15,6 +15,7 @@ import ( "github.com/docker/docker/dockerversion" "github.com/docker/docker/registry" "github.com/docker/engine-api/types" + "github.com/docker/go-connections/sockets" "golang.org/x/net/context" ) @@ -43,20 +44,27 @@ func NewV2Repository(ctx context.Context, repoInfo *registry.RepositoryInfo, end repoName = repoInfo.RemoteName() } + direct := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + } + // TODO(dmcgowan): Call close idle connections when complete, use keep alive base := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - }).Dial, + Proxy: http.ProxyFromEnvironment, + Dial: direct.Dial, TLSHandshakeTimeout: 10 * time.Second, TLSClientConfig: endpoint.TLSConfig, // TODO(dmcgowan): Call close idle connections when complete and use keep alive DisableKeepAlives: true, } + proxyDialer, err := sockets.DialerFromEnvironment(direct) + if err == nil { + base.Dial = proxyDialer.Dial + } + modifiers := registry.DockerHeaders(dockerversion.DockerUserAgent(ctx), metaHeaders) authTransport := transport.NewTransport(base, modifiers...) diff --git a/registry/registry.go b/registry/registry.go index 8fdfe3b0a4..0b5a070e32 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -16,6 +16,7 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/distribution/registry/client/transport" + "github.com/docker/go-connections/sockets" "github.com/docker/go-connections/tlsconfig" ) @@ -165,16 +166,25 @@ func NewTransport(tlsConfig *tls.Config) *http.Transport { var cfg = tlsconfig.ServerDefault tlsConfig = &cfg } - return &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - }).Dial, + + direct := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + } + + base := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: direct.Dial, TLSHandshakeTimeout: 10 * time.Second, TLSClientConfig: tlsConfig, // TODO(dmcgowan): Call close idle connections when complete and use keep alive DisableKeepAlives: true, } + + proxyDialer, err := sockets.DialerFromEnvironment(direct) + if err == nil { + base.Dial = proxyDialer.Dial + } + return base }