@@ -81,7 +81,6 @@ type DockerCli struct {
8181 contextStore store.Store
8282 init sync.Once
8383 initErr error
84- dockerEndpoint docker.Endpoint
8584 contextStoreConfig store.Config
8685 initTimeout time.Duration
8786}
@@ -153,7 +152,7 @@ func (cli *DockerCli) loadConfigFile() {
153152// ServerInfo returns the server version details for the host this client is
154153// connected to
155154func (cli * DockerCli ) ServerInfo () ServerInfo {
156- // TODO(thaJeztah) make ServerInfo() lazily load the info (ping only when needed )
155+ _ = cli . initialize ( )
157156 return cli .serverInfo
158157}
159158
@@ -329,7 +328,7 @@ func (cli *DockerCli) getInitTimeout() time.Duration {
329328 return defaultInitTimeout
330329}
331330
332- func (cli * DockerCli ) initializeFromClient () {
331+ func (cli * DockerCli ) initializeFromClient (apiClient client. APIClient ) ServerInfo {
333332 ctx := context .Background ()
334333 if ! strings .HasPrefix (cli .DockerEndpoint ().Host , "ssh://" ) {
335334 // @FIXME context.WithTimeout doesn't work with connhelper / ssh connections
@@ -339,24 +338,22 @@ func (cli *DockerCli) initializeFromClient() {
339338 defer cancel ()
340339 }
341340
342- ping , err := cli . client .Ping (ctx )
341+ ping , err := apiClient .Ping (ctx )
343342 if err != nil {
344343 // Default to true if we fail to connect to daemon
345- cli .serverInfo = ServerInfo {HasExperimental : true }
346-
347344 if ping .APIVersion != "" {
348- cli . client .NegotiateAPIVersionPing (ping )
345+ apiClient .NegotiateAPIVersionPing (ping )
349346 }
350- return
347+ return ServerInfo { HasExperimental : true }
351348 }
349+ apiClient .NegotiateAPIVersionPing (ping )
352350
353- cli . serverInfo = ServerInfo {
351+ return ServerInfo {
354352 HasExperimental : ping .Experimental ,
355353 OSType : ping .OSType ,
356354 BuildkitVersion : ping .BuilderVersion ,
357355 SwarmStatus : ping .SwarmStatus ,
358356 }
359- cli .client .NegotiateAPIVersionPing (ping )
360357}
361358
362359// NotaryClient provides a Notary Repository to interact with signed metadata for an image
@@ -428,27 +425,39 @@ func resolveContextName(opts *cliflags.ClientOptions, config *configfile.ConfigF
428425
429426// DockerEndpoint returns the current docker endpoint
430427func (cli * DockerCli ) DockerEndpoint () docker.Endpoint {
431- if err := cli .initialize (); err != nil {
432- // Note that we're not terminating here, as this function may be used
433- // in cases where we're able to continue.
434- _ , _ = fmt .Fprintf (cli .Err (), "Failed to initialize: %s\n " , cli .initErr )
428+ ep , _ := cli .getDockerEndPoint ()
429+ // if err != nil {
430+ // // This fails if no contextStore is configured; we should fall
431+ // // back to using default, but only if resolveContextName uses
432+ // // DefaultContextName.
433+ // ep1, err := ResolveDefaultContext(cli.options, storeConfig)
434+ // ep = ep1.(docker.Endpoint)
435+ // panic(err)
436+ // }
437+ return ep
438+ }
439+
440+ func (cli * DockerCli ) getDockerEndPoint () (ep docker.Endpoint , err error ) {
441+ if cn := cli .CurrentContext (); cn == DefaultContextName {
442+ return resolveDefaultDockerEndpoint (cli .options )
443+ } else {
444+ return resolveDockerEndpoint (cli .contextStore , cn )
435445 }
436- return cli .dockerEndpoint
437446}
438447
439448func (cli * DockerCli ) initialize () error {
440449 cli .init .Do (func () {
441- cli .dockerEndpoint , cli .initErr = resolveDockerEndpoint (cli .contextStore , resolveContextName (cli .options , cli .configFile ))
442- if cli .initErr != nil {
443- cli .initErr = errors .Wrap (cli .initErr , "unable to resolve docker endpoint" )
444- return
445- }
446450 if cli .client == nil {
447- if cli .client , cli .initErr = newAPIClientFromEndpoint (cli .dockerEndpoint , cli .configFile ); cli .initErr != nil {
451+ var ep docker.Endpoint
452+ ep , cli .initErr = cli .getDockerEndPoint ()
453+ if cli .initErr != nil {
454+ return
455+ }
456+ if cli .client , cli .initErr = newAPIClientFromEndpoint (ep , cli .configFile ); cli .initErr != nil {
448457 return
449458 }
450459 }
451- cli .initializeFromClient ()
460+ cli .serverInfo = cli . initializeFromClient (cli . client )
452461 })
453462 return cli .initErr
454463}
0 commit comments