From 9bdc0cc27d6d5d35f2830c9366a366c9dd09be0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=89AU?= Date: Mon, 2 Sep 2024 22:21:54 +0200 Subject: [PATCH 1/3] Fix ssh context not working --- pkg/commands/docker.go | 22 ++++++++++++++++------ pkg/commands/ssh/ssh.go | 7 ++++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/pkg/commands/docker.go b/pkg/commands/docker.go index e96c96533..234776cdf 100644 --- a/pkg/commands/docker.go +++ b/pkg/commands/docker.go @@ -69,19 +69,29 @@ func (c *DockerCommand) NewCommandObject(obj CommandObject) CommandObject { return defaultObj } -// NewDockerCommand it runs docker commands +// NewDockerCommand creates a DockerCommand struct that will be able to run docker commands. func NewDockerCommand(log *logrus.Entry, osCommand *OSCommand, tr *i18n.TranslationSet, config *config.AppConfig, errorChan chan error) (*DockerCommand, error) { - tunnelCloser, err := ssh.NewSSHHandler(osCommand).HandleSSHDockerHost() + dockerHost, err := determineDockerHost() if err != nil { - ogLog.Fatal(err) + ogLog.Printf("> could not determine host %v", err) } - dockerHost, err := determineDockerHost() + tunnelCloser, err := ssh.NewSSHHandler(osCommand).HandleSSHDockerHost(dockerHost) if err != nil { - ogLog.Printf("> could not determine host %v", err) + ogLog.Fatal(err) + } + + clientOpts := []client.Opt{ + client.FromEnv, + client.WithVersion(APIVersion), + } + // For an ssh connection the DOCKER_HOST env variable has been overridden. + // Discard the previously determined dockerHost + if !strings.HasPrefix(dockerHost, "ssh://") { + clientOpts = append(clientOpts, client.WithHost(dockerHost)) } - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithVersion(APIVersion), client.WithHost(dockerHost)) + cli, err := client.NewClientWithOpts(clientOpts...) if err != nil { ogLog.Fatal(err) } diff --git a/pkg/commands/ssh/ssh.go b/pkg/commands/ssh/ssh.go index ecc840459..14d13f652 100644 --- a/pkg/commands/ssh/ssh.go +++ b/pkg/commands/ssh/ssh.go @@ -44,10 +44,11 @@ func NewSSHHandler(oSCommand CmdKiller) *SSHHandler { // HandleSSHDockerHost overrides the DOCKER_HOST environment variable // to point towards a local unix socket tunneled over SSH to the specified ssh host. -func (self *SSHHandler) HandleSSHDockerHost() (io.Closer, error) { +func (self *SSHHandler) HandleSSHDockerHost(dockerHost string) (io.Closer, error) { const key = "DOCKER_HOST" ctx := context.Background() - u, err := url.Parse(self.getenv(key)) + + u, err := url.Parse(dockerHost) if err != nil { // if no or an invalid docker host is specified, continue nominally return noopCloser{}, nil @@ -55,7 +56,7 @@ func (self *SSHHandler) HandleSSHDockerHost() (io.Closer, error) { // if the docker host scheme is "ssh", forward the docker socket before creating the client if u.Scheme == "ssh" { - tunnel, err := self.createDockerHostTunnel(ctx, u.Host) + tunnel, err := self.createDockerHostTunnel(ctx, u.String()) if err != nil { return noopCloser{}, fmt.Errorf("tunnel ssh docker host: %w", err) } From 21e18fe7a5587931c0cb1728415a673e7b2bcd02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=89AU?= Date: Mon, 2 Sep 2024 22:27:48 +0200 Subject: [PATCH 2/3] Update comment --- pkg/commands/docker.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/commands/docker.go b/pkg/commands/docker.go index 234776cdf..61d16879d 100644 --- a/pkg/commands/docker.go +++ b/pkg/commands/docker.go @@ -69,7 +69,8 @@ func (c *DockerCommand) NewCommandObject(obj CommandObject) CommandObject { return defaultObj } -// NewDockerCommand creates a DockerCommand struct that will be able to run docker commands. +// NewDockerCommand creates a DockerCommand struct that wraps the docker client. +// Able to run docker commands. And handles func NewDockerCommand(log *logrus.Entry, osCommand *OSCommand, tr *i18n.TranslationSet, config *config.AppConfig, errorChan chan error) (*DockerCommand, error) { dockerHost, err := determineDockerHost() if err != nil { From 94494348d032d663db6372cc5143d87d3b8cbe1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=89AU?= Date: Sun, 8 Sep 2024 00:18:39 +0200 Subject: [PATCH 3/3] update test to reflect change to the queried ssh host --- pkg/commands/ssh/ssh_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/commands/ssh/ssh_test.go b/pkg/commands/ssh/ssh_test.go index f1ea1b90d..3be7bb5e9 100644 --- a/pkg/commands/ssh/ssh_test.go +++ b/pkg/commands/ssh/ssh_test.go @@ -64,7 +64,7 @@ func TestSSHHandlerHandleSSHDockerHost(t *testing.T) { startCmdCount := 0 startCmd := func(cmd *exec.Cmd) error { - assert.EqualValues(t, []string{"ssh", "-L", "/tmp/lazydocker-ssh-tunnel-12345/dockerhost.sock:/var/run/docker.sock", "192.168.5.178", "-N"}, cmd.Args) + assert.EqualValues(t, []string{"ssh", "-L", "/tmp/lazydocker-ssh-tunnel-12345/dockerhost.sock:/var/run/docker.sock", s.envVarValue, "-N"}, cmd.Args) startCmdCount++ @@ -91,7 +91,7 @@ func TestSSHHandlerHandleSSHDockerHost(t *testing.T) { setenv: setenv, } - _, err := handler.HandleSSHDockerHost() + _, err := handler.HandleSSHDockerHost(s.envVarValue) assert.NoError(t, err) assert.Equal(t, s.expectedDialContextCount, dialContextCount)