From 892fc090b62bbd9f11156abc5da8201cfe540a1b Mon Sep 17 00:00:00 2001 From: Charlie Moog Date: Sun, 26 Dec 2021 09:41:43 -0600 Subject: [PATCH] set pgid and send kill signal on exit --- main.go | 2 ++ pkg/commands/docker.go | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 6b256b66..34e651ba 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( "github.com/go-errors/errors" "github.com/integrii/flaggy" "github.com/jesseduffield/lazydocker/pkg/app" + "github.com/jesseduffield/lazydocker/pkg/commands" "github.com/jesseduffield/lazydocker/pkg/config" "github.com/jesseduffield/yaml" ) @@ -73,6 +74,7 @@ func main() { if err == nil { err = app.Run() } + commands.CloseDockerSocketConnection() if err != nil { if errMessage, known := app.KnownError(err); known { diff --git a/pkg/commands/docker.go b/pkg/commands/docker.go index 3f1087f6..4045852d 100644 --- a/pkg/commands/docker.go +++ b/pkg/commands/docker.go @@ -15,6 +15,7 @@ import ( "sort" "strings" "sync" + "syscall" "time" "github.com/acarl005/stripansi" @@ -151,16 +152,30 @@ func tryDial(ctx context.Context, socketPath string) error { return nil } +// CloseDockerSocketConnection kills the docker socket SSH forwarding process, if it exists. +// +// If will exist when DOCKER_HOST has the protocol scheme `ssh://`. +func CloseDockerSocketConnection() { + if dockerSSHConnection != nil { + syscall.Kill(-dockerSSHConnection.Process.Pid, syscall.SIGKILL) + } +} + +// dockerSSHConnection holds package-level state for the last-opened SSH tunnel to a remote docker socket. +var dockerSSHConnection *exec.Cmd + func tunnelSSH(ctx context.Context, host, localSocket string) error { cmd := exec.CommandContext(ctx, "ssh", "-L", localSocket+":/var/run/docker.sock", host, "-N") + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} err := cmd.Start() if err != nil { return err } + dockerSSHConnection = cmd return nil } -// Build a new docker client from the enviornment. +// Build a new docker client from the environment. // // Handle special cases including `ssh://` host schemes. func clientBuilder(c *client.Client) error {