@@ -22,6 +22,7 @@ import (
22
22
"github.com/docker/cli/templates"
23
23
"github.com/docker/docker/api/types/swarm"
24
24
"github.com/docker/docker/api/types/system"
25
+ "github.com/docker/docker/client"
25
26
"github.com/docker/docker/registry"
26
27
"github.com/docker/go-units"
27
28
"github.com/spf13/cobra"
@@ -89,37 +90,41 @@ func runInfo(ctx context.Context, cmd *cobra.Command, dockerCli command.Cli, opt
89
90
clientVersion : newClientVersion (dockerCli .CurrentContext (), nil ),
90
91
Debug : debug .IsEnabled (),
91
92
},
92
- Info : & system. Info {} ,
93
+ Info : nil ,
93
94
}
94
95
if plugins , err := pluginmanager .ListPlugins (dockerCli , cmd .Root ()); err == nil {
95
96
info .ClientInfo .Plugins = plugins
96
97
} else {
97
98
info .ClientErrors = append (info .ClientErrors , err .Error ())
98
99
}
99
100
101
+ noFormat := opts .format == ""
102
+
103
+ if noFormat {
104
+ info .UserName = dockerCli .ConfigFile ().AuthConfigs [registry .IndexServer ].Username
105
+ info .ClientInfo .APIVersion = dockerCli .CurrentVersion ()
106
+ }
107
+
100
108
if needsServerInfo (opts .format , info ) {
101
- if dinfo , err := dockerCli .Client ().Info (ctx ); err == nil {
102
- info .Info = & dinfo
103
- } else {
104
- info .ServerErrors = append (info .ServerErrors , err .Error ())
105
- if opts .format == "" {
106
- // reset the server info to prevent printing "empty" Server info
107
- // and warnings, but don't reset it if a custom format was specified
108
- // to prevent errors from Go's template parsing during format.
109
- info .Info = nil
110
- } else {
111
- // if a format is provided, print the error, as it may be hidden
112
- // otherwise if the template doesn't include the ServerErrors field.
113
- fprintln (dockerCli .Err (), err )
109
+ dinfo , err := dockerCli .Client ().Info (ctx )
110
+ if err != nil && client .IsErrConnectionFailed (err ) {
111
+ var printErr error
112
+ if noFormat {
113
+ printErr = prettyPrintInfo (dockerCli , info )
114
114
}
115
+ return cli.StatusError {StatusCode : 125 , Cause : errors .Join (err , printErr )}
116
+ } else if err != nil {
117
+ // if a format is provided, print the error, as it may be hidden
118
+ // otherwise if the template doesn't include the ServerErrors field.
119
+ info .ServerErrors = append (info .ServerErrors , err .Error ())
115
120
}
121
+ info .Info = & dinfo
116
122
}
117
123
118
- if opts .format == "" {
119
- info .UserName = dockerCli .ConfigFile ().AuthConfigs [registry .IndexServer ].Username
120
- info .ClientInfo .APIVersion = dockerCli .CurrentVersion ()
124
+ if noFormat {
121
125
return prettyPrintInfo (dockerCli , info )
122
126
}
127
+
123
128
return formatInfo (dockerCli .Out (), info , opts .format )
124
129
}
125
130
0 commit comments