From 45644c82f632ca5e3db5286a6bdc814d8535246e Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Fri, 17 Jul 2020 17:38:02 +0200 Subject: [PATCH] Docker swarm: enable unix socket Fixes #7603 Signed-off-by: Julien Pivotto --- discovery/dockerswarm/dockerswarm.go | 34 ++++++++++++++++++---------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/discovery/dockerswarm/dockerswarm.go b/discovery/dockerswarm/dockerswarm.go index 418eb9d8e7..0073f15162 100644 --- a/discovery/dockerswarm/dockerswarm.go +++ b/discovery/dockerswarm/dockerswarm.go @@ -88,16 +88,12 @@ type Discovery struct { // NewDiscovery returns a new Discovery which periodically refreshes its targets. func NewDiscovery(conf *SDConfig, logger log.Logger) (*Discovery, error) { + var err error d := &Discovery{ port: conf.Port, role: conf.Role, } - rt, err := config_util.NewRoundTripperFromConfig(conf.HTTPClientConfig, "dockerswarm_sd", false) - if err != nil { - return nil, err - } - // This is used in tests. In normal situations, it is set when Unmarshaling. if conf.url == nil { conf.url, err = url.Parse(conf.Host) @@ -106,15 +102,29 @@ func NewDiscovery(conf *SDConfig, logger log.Logger) (*Discovery, error) { } } - d.client, err = client.NewClientWithOpts( + opts := []client.Opt{ client.WithHost(conf.Host), - client.WithHTTPClient(&http.Client{ - Transport: rt, - Timeout: time.Duration(conf.RefreshInterval), - }), - client.WithScheme(conf.url.Scheme), client.WithAPIVersionNegotiation(), - ) + } + + // There are other protocols that HTTP supported by the Docker daemon, like + // unix, which do not require an http client. Passing an http client to the + // docker client makes those non-http requests fail. + if conf.url.Scheme == "http" || conf.url.Scheme == "https" { + rt, err := config_util.NewRoundTripperFromConfig(conf.HTTPClientConfig, "dockerswarm_sd", false) + if err != nil { + return nil, err + } + opts = append(opts, + client.WithHTTPClient(&http.Client{ + Transport: rt, + Timeout: time.Duration(conf.RefreshInterval), + }), + client.WithScheme(conf.url.Scheme), + ) + } + + d.client, err = client.NewClientWithOpts(opts...) if err != nil { return nil, fmt.Errorf("error setting up docker swarm client: %w", err) }