From cacd6e2dcb955ca38880643a13860f9d0af9375e Mon Sep 17 00:00:00 2001 From: Eljees <3.14hell@gmail.com> Date: Wed, 29 Jul 2026 21:57:58 +0300 Subject: [PATCH] fix: honor standard Docker host environment Signed-off-by: Eljees <3.14hell@gmail.com> --- pkg/app.go | 2 +- pkg/run_test.go | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 pkg/run_test.go diff --git a/pkg/app.go b/pkg/app.go index 94a2e65..1358198 100644 --- a/pkg/app.go +++ b/pkg/app.go @@ -154,7 +154,7 @@ func NewApp() *cli.Command { }, &cli.StringFlag{ Name: "host", - Sources: cli.EnvVars("DOCKLE_HOST"), + Sources: cli.EnvVars("DOCKLE_HOST", "DOCKER_HOST"), Usage: "docker daemon host", }, &cli.StringFlag{ diff --git a/pkg/run_test.go b/pkg/run_test.go new file mode 100644 index 0000000..d0038bb --- /dev/null +++ b/pkg/run_test.go @@ -0,0 +1,88 @@ +package pkg + +import ( + "context" + "os" + "testing" + + "github.com/urfave/cli/v3" +) + +func setOptionalEnv(t *testing.T, key, value string) { + t.Helper() + original, exists := os.LookupEnv(key) + if value == "" { + if err := os.Unsetenv(key); err != nil { + t.Fatalf("unset %s: %v", key, err) + } + } else if err := os.Setenv(key, value); err != nil { + t.Fatalf("set %s: %v", key, err) + } + t.Cleanup(func() { + if exists { + _ = os.Setenv(key, original) + } else { + _ = os.Unsetenv(key) + } + }) +} + +func TestGetDockerSockPath(t *testing.T) { + tests := []struct { + name string + args []string + dockleHost string + dockerHost string + xdgRuntime string + expected string + }{ + { + name: "explicit host takes precedence", + args: []string{"--host", "tcp://explicit:2375"}, + dockerHost: "tcp://docker:2375", + expected: "tcp://explicit:2375", + }, + { + name: "dockle host environment takes precedence", + dockleHost: "tcp://dockle:2375", + dockerHost: "tcp://docker:2375", + expected: "tcp://dockle:2375", + }, + { + name: "standard docker host environment", + dockerHost: "tcp://docker:2375", + expected: "tcp://docker:2375", + }, + { + name: "xdg socket", + args: []string{"--use-xdg"}, + xdgRuntime: "/run/user/1000", + expected: "unix:///run/user/1000/docker.sock", + }, + { + name: "default socket", + expected: "unix:///var/run/docker.sock", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + setOptionalEnv(t, "DOCKLE_HOST", tt.dockleHost) + setOptionalEnv(t, "DOCKER_HOST", tt.dockerHost) + setOptionalEnv(t, "XDG_RUNTIME_DIR", tt.xdgRuntime) + + var actual string + cmd := NewApp() + cmd.Action = func(_ context.Context, cmd *cli.Command) error { + actual = getDockerSockPath(cmd) + return nil + } + if err := cmd.Run(context.Background(), append([]string{"dockle"}, tt.args...)); err != nil { + t.Fatalf("run command: %v", err) + } + if actual != tt.expected { + t.Fatalf("getDockerSockPath() = %q, want %q", actual, tt.expected) + } + }) + } +}