@@ -3,6 +3,7 @@ package main
33import (
44 "fmt"
55 "os"
6+ "strings"
67
78 "github.com/Sirupsen/logrus"
89 "github.com/docker/docker/cli"
@@ -33,7 +34,8 @@ func newDockerCommand(dockerCli *command.DockerCli) *cobra.Command {
3334 showVersion ()
3435 return nil
3536 }
36- fmt .Fprintf (dockerCli .Err (), "\n " + cmd .UsageString ())
37+ cmd .SetOutput (dockerCli .Err ())
38+ cmd .HelpFunc ()(cmd , args )
3739 return nil
3840 },
3941 PersistentPreRunE : func (cmd * cobra.Command , args []string ) error {
@@ -45,6 +47,22 @@ func newDockerCommand(dockerCli *command.DockerCli) *cobra.Command {
4547 }
4648 cli .SetupRootCommand (cmd )
4749
50+ cmd .SetHelpFunc (func (ccmd * cobra.Command , args []string ) {
51+ var err error
52+ if dockerCli .Client () == nil {
53+ // flags must be the top-level command flags, not cmd.Flags()
54+ opts .Common .SetDefaultOptions (flags )
55+ dockerPreRun (opts )
56+ err = dockerCli .Initialize (opts )
57+ }
58+ if err != nil || ! dockerCli .HasExperimental () {
59+ hideExperimentalFeatures (ccmd )
60+ }
61+ if err := ccmd .Help (); err != nil {
62+ ccmd .Println (err )
63+ }
64+ })
65+
4866 flags = cmd .Flags ()
4967 flags .BoolVarP (& opts .Version , "version" , "v" , false , "Print version information and quit" )
5068 flags .StringVar (& opts .ConfigDir , "config" , cliconfig .ConfigDir (), "Location of client config files" )
@@ -105,3 +123,20 @@ func dockerPreRun(opts *cliflags.ClientOptions) {
105123 utils .EnableDebug ()
106124 }
107125}
126+
127+ func hideExperimentalFeatures (cmd * cobra.Command ) {
128+ // hide flags
129+ cmd .Flags ().VisitAll (func (f * pflag.Flag ) {
130+ if _ , ok := f .Annotations ["experimental" ]; ok {
131+ f .Hidden = true
132+ }
133+ })
134+
135+ for _ , subcmd := range cmd .Commands () {
136+ // hide subcommands
137+ name := strings .Split (subcmd .Use , " " )[0 ]
138+ if name == "stack" || name == "deploy" || name == "checkpoint" || name == "plugin" {
139+ subcmd .Hidden = true
140+ }
141+ }
142+ }
0 commit comments