diff --git a/cli/cmd/mobyflags/mobyflags.go b/cli/cmd/mobyflags/mobyflags.go index b094ef537..dcce02d8b 100644 --- a/cli/cmd/mobyflags/mobyflags.go +++ b/cli/cmd/mobyflags/mobyflags.go @@ -8,9 +8,6 @@ import ( // AddMobyFlagsForRetrocompatibility adds retrocompatibility flags to our commands func AddMobyFlagsForRetrocompatibility(flags *flag.FlagSet) { - const hostFlag = "host" - flags.StringP(hostFlag, "H", "", "Daemon socket(s) to connect to") - markHidden(flags, hostFlag) const logLevelFlag = "log-level" flags.StringP(logLevelFlag, "l", "info", `Set the logging level ("debug"|"info"|"warn"|"error"|"fatal")`) markHidden(flags, logLevelFlag) diff --git a/cli/main.go b/cli/main.go index 792d921a5..e20ac00ae 100644 --- a/cli/main.go +++ b/cli/main.go @@ -121,6 +121,7 @@ func main() { }) root.PersistentFlags().BoolVarP(&opts.Debug, "debug", "D", false, "enable debug output in the logs") + root.PersistentFlags().StringVarP(&opts.Host, "host", "H", "", "Daemon socket(s) to connect to") opts.AddConfigFlags(root.PersistentFlags()) opts.AddContextFlags(root.PersistentFlags()) @@ -133,6 +134,10 @@ func main() { ctx, cancel := newSigContext() defer cancel() + if opts.Host != "" { + mobycli.ExecRegardlessContext(ctx) + } + if opts.Config == "" { fatal(errors.New("config path cannot be empty")) } diff --git a/cli/mobycli/exec.go b/cli/mobycli/exec.go index 18c84028c..511f36c11 100644 --- a/cli/mobycli/exec.go +++ b/cli/mobycli/exec.go @@ -42,11 +42,12 @@ func ExecIfDefaultCtxType(ctx context.Context) { // Only run original docker command if the current context is not // ours. if err != nil || currentCtx.Type() == store.DefaultContextType { - shellOut(ctx) + ExecRegardlessContext(ctx) } } -func shellOut(ctx context.Context) { +// ExecRegardlessContext delegates to com.docker.cli if on moby context +func ExecRegardlessContext(ctx context.Context) { cmd := exec.CommandContext(ctx, ComDockerCli, os.Args[1:]...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout @@ -63,7 +64,7 @@ func shellOut(ctx context.Context) { // ExecCmd delegates the cli command to com.docker.cli. The error is never returned (process will exit with docker classic exit code), the return type is to make it easier to use with cobra commands func ExecCmd(command *cobra.Command) error { - shellOut(command.Context()) + ExecRegardlessContext(command.Context()) return nil } diff --git a/cli/options/options.go b/cli/options/options.go index 8bcf2dbe3..9496f8622 100644 --- a/cli/options/options.go +++ b/cli/options/options.go @@ -26,4 +26,5 @@ type GlobalOpts struct { apicontext.ContextFlags cliconfig.ConfigFlags Debug bool + Host string } diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index d8442c505..65030db1b 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -19,6 +19,7 @@ package main import ( "os" "path/filepath" + "runtime" "testing" "time" @@ -187,18 +188,19 @@ func (s *E2eSuite) TestLeaveLegacyErrorMessagesUnchanged() { func (s *E2eSuite) TestPassThroughRootLegacyFlags() { output, err := s.NewDockerCommand("-H", "tcp://localhost:123", "version").Exec() - Expect(err).To(BeNil()) - Expect(output).To(ContainSubstring("Client:")) + Expect(err).NotTo(BeNil()) + Expect(output).NotTo(ContainSubstring("unknown shorthand flag")) Expect(output).To(ContainSubstring("localhost:123")) output, _ = s.NewDockerCommand("-H", "tcp://localhost:123", "login", "-u", "nouser", "-p", "wrongpasword").Exec() + Expect(output).NotTo(ContainSubstring("unknown shorthand flag")) Expect(output).To(ContainSubstring("WARNING! Using --password via the CLI is insecure")) output, _ = s.NewDockerCommand("--log-level", "debug", "login", "-u", "nouser", "-p", "wrongpasword").Exec() + Expect(output).NotTo(ContainSubstring("unknown shorthand flag")) Expect(output).To(ContainSubstring("WARNING! Using --password via the CLI is insecure")) output, _ = s.NewDockerCommand("login", "--help").Exec() - Expect(output).NotTo(ContainSubstring("--host")) Expect(output).NotTo(ContainSubstring("--log-level")) } @@ -209,6 +211,21 @@ func (s *E2eSuite) TestDisplayFriendlyErrorMessageForLegacyCommands() { Expect(err).NotTo(BeNil()) } +func (s *E2eSuite) TestExecMobyIfUsingHostFlag() { + s.NewDockerCommand("context", "create", "example", "test-example").ExecOrDie() + s.NewDockerCommand("context", "use", "test-example").ExecOrDie() + output, err := s.NewDockerCommand("-H", defaultEndpoint(), "ps").Exec() + Expect(err).To(BeNil()) + Expect(output).To(ContainSubstring("CONTAINER ID")) +} + +func defaultEndpoint() string { + if runtime.GOOS == "windows" { + return "npipe:////./pipe/docker_engine" + } + return "unix:///var/run/docker.sock" +} + func (s *E2eSuite) TestDisplaysAdditionalLineInDockerVersion() { output := s.NewDockerCommand("version").ExecOrDie() Expect(output).To(ContainSubstring("Azure integration"))