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] Fix ssh context not working --- pkg/commands/docker.go | 24 +++++++++++++++++------- pkg/commands/ssh/ssh.go | 7 ++++--- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/pkg/commands/docker.go b/pkg/commands/docker.go index e96c9653..234776cd 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() - if err != nil { - ogLog.Fatal(err) - } - dockerHost, err := determineDockerHost() if err != nil { ogLog.Printf("> could not determine host %v", err) } - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithVersion(APIVersion), client.WithHost(dockerHost)) + tunnelCloser, err := ssh.NewSSHHandler(osCommand).HandleSSHDockerHost(dockerHost) + if err != nil { + 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(clientOpts...) if err != nil { ogLog.Fatal(err) } diff --git a/pkg/commands/ssh/ssh.go b/pkg/commands/ssh/ssh.go index ecc84045..14d13f65 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) }