From 25ebf0ec9c1cc0d0468e060072e6ab2ff7b87166 Mon Sep 17 00:00:00 2001 From: Jakub Panek Date: Sat, 4 Mar 2023 13:53:25 +0100 Subject: [PATCH] connhelper: Allow socket path when using SSH Signed-off-by: Jakub Panek --- cli/connhelper/connhelper.go | 7 ++++++- cli/connhelper/ssh/ssh.go | 5 ++--- cli/connhelper/ssh/ssh_test.go | 6 ++++-- docs/reference/commandline/dockerd.md | 1 + 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/cli/connhelper/connhelper.go b/cli/connhelper/connhelper.go index 9ac9d6744d..397149c3e2 100644 --- a/cli/connhelper/connhelper.go +++ b/cli/connhelper/connhelper.go @@ -47,7 +47,12 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*ConnectionHelper } return &ConnectionHelper{ Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) { - return commandconn.New(ctx, "ssh", append(sshFlags, sp.Args("docker", "system", "dial-stdio")...)...) + args := []string{"docker"} + if sp.Path != "" { + args = append(args, "--host", "unix://"+sp.Path) + } + args = append(args, "system", "dial-stdio") + return commandconn.New(ctx, "ssh", append(sshFlags, sp.Args(args...)...)...) }, Host: "http://docker.example.com", }, nil diff --git a/cli/connhelper/ssh/ssh.go b/cli/connhelper/ssh/ssh.go index bde01ae7f7..fb4c911105 100644 --- a/cli/connhelper/ssh/ssh.go +++ b/cli/connhelper/ssh/ssh.go @@ -30,9 +30,7 @@ func ParseURL(daemonURL string) (*Spec, error) { return nil, errors.Errorf("no host specified") } sp.Port = u.Port() - if u.Path != "" { - return nil, errors.Errorf("extra path after the host: %q", u.Path) - } + sp.Path = u.Path if u.RawQuery != "" { return nil, errors.Errorf("extra query after the host: %q", u.RawQuery) } @@ -47,6 +45,7 @@ type Spec struct { User string Host string Port string + Path string } // Args returns args except "ssh" itself combined with optional additional command args diff --git a/cli/connhelper/ssh/ssh_test.go b/cli/connhelper/ssh/ssh_test.go index 87c3c3c49c..4b6d2c341d 100644 --- a/cli/connhelper/ssh/ssh_test.go +++ b/cli/connhelper/ssh/ssh_test.go @@ -32,8 +32,10 @@ func TestParseURL(t *testing.T) { expectedError: "plain-text password is not supported", }, { - url: "ssh://foo/bar", - expectedError: `extra path after the host: "/bar"`, + url: "ssh://foo/bar", + expectedArgs: []string{ + "--", "foo", + }, }, { url: "ssh://foo?bar", diff --git a/docs/reference/commandline/dockerd.md b/docs/reference/commandline/dockerd.md index ba7d9be8ab..12be4b9e3d 100644 --- a/docs/reference/commandline/dockerd.md +++ b/docs/reference/commandline/dockerd.md @@ -213,6 +213,7 @@ precedence over `HTTP_PROXY`. The Docker client supports connecting to a remote daemon via SSH: ```console +$ docker -H ssh://me@example.com:22/var/run/docker.sock ps $ docker -H ssh://me@example.com:22 ps $ docker -H ssh://me@example.com ps $ docker -H ssh://example.com ps