From c04dd6e244a95ef00fe37c1cc1caa664acd14863 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Thu, 10 Oct 2019 09:53:03 -0700 Subject: [PATCH 1/2] connhelper: add ssh multiplexing Signed-off-by: Tonis Tiigi --- cli/connhelper/connhelper.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/cli/connhelper/connhelper.go b/cli/connhelper/connhelper.go index da3640db1a28..58f0c7a1d63a 100644 --- a/cli/connhelper/connhelper.go +++ b/cli/connhelper/connhelper.go @@ -5,7 +5,10 @@ import ( "context" "net" "net/url" + "os" + "strconv" + "github.com/docker/cli/cli/config" "github.com/docker/cli/cli/connhelper/commandconn" "github.com/docker/cli/cli/connhelper/ssh" "github.com/pkg/errors" @@ -34,7 +37,7 @@ func GetConnectionHelper(daemonURL string) (*ConnectionHelper, error) { } return &ConnectionHelper{ Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) { - return commandconn.New(ctx, "ssh", append(sp.Args(), []string{"--", "docker", "system", "dial-stdio"}...)...) + return commandconn.New(ctx, "ssh", append(multiplexingArgs(), append(sp.Args(), []string{"--", "docker", "system", "dial-stdio"}...)...)...) }, Host: "http://docker", }, nil @@ -53,3 +56,19 @@ func GetCommandConnectionHelper(cmd string, flags ...string) (*ConnectionHelper, Host: "http://docker", }, nil } + +func multiplexingArgs() []string { + if v := os.Getenv("DOCKER_SSH_NO_MUX"); v != "" { + if b, err := strconv.ParseBool(v); err == nil && b { + return nil + } + } + if err := os.MkdirAll(config.Dir(), 0700); err != nil { + return nil + } + args := []string{"-o", "ControlMaster=auto", "-o", "ControlPath=" + config.Dir() + "/%r@%h:%p"} + if v := os.Getenv("DOCKER_SSH_MUX_PERSIST"); v != "" { + args = append(args, "-o", "ControlPersist="+v) + } + return args +} From 4ecbef46602f62c52b8e3a36401265dc87fab940 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Thu, 9 Jan 2020 10:19:01 -0800 Subject: [PATCH 2/2] docs: document ssh multiplexing env Signed-off-by: Tonis Tiigi --- docs/reference/commandline/cli.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/reference/commandline/cli.md b/docs/reference/commandline/cli.md index b5aef34692f4..ce8d554c0cc7 100644 --- a/docs/reference/commandline/cli.md +++ b/docs/reference/commandline/cli.md @@ -86,6 +86,8 @@ by the `docker` command line: * `DOCKER_TMPDIR` Location for temporary Docker files. * `DOCKER_CONTEXT` Specify the context to use (overrides DOCKER_HOST env var and default context set with "docker context use") * `DOCKER_DEFAULT_PLATFORM` Specify the default platform for the commands that take the `--platform` flag. +* `DOCKER_SSH_NO_MUX` If set will turn off SSH multiplexing when connecting to daemon through SSH. +* `DOCKER_SSH_MUX_PERSIST` Set a duration for keeping SSH multiplexing socket alive between commands (e.g `60s`). Because Docker is developed using Go, you can also use any environment variables used by the Go runtime. In particular, you may find these useful: