@@ -3,6 +3,7 @@ package command
33import (
44 "context"
55 "io"
6+ "io/ioutil"
67 "os"
78 "path/filepath"
89 "runtime"
@@ -209,12 +210,18 @@ func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions, ops ...Initialize
209210
210211 cli .configFile = cliconfig .LoadDefaultConfigFile (cli .err )
211212
212- cli .contextStore = store .New (cliconfig .ContextStoreDir (), cli .contextStoreConfig )
213+ baseContextSore := store .New (cliconfig .ContextStoreDir (), cli .contextStoreConfig )
214+ cli .contextStore = & ContextStoreWithDefault {
215+ Store : baseContextSore ,
216+ Resolver : func () (* DefaultContext , error ) {
217+ return resolveDefaultContext (opts .Common , cli .ConfigFile (), cli .Err ())
218+ },
219+ }
213220 cli .currentContext , err = resolveContextName (opts .Common , cli .configFile , cli .contextStore )
214221 if err != nil {
215222 return err
216223 }
217- cli .dockerEndpoint , err = resolveDockerEndpoint (cli .contextStore , cli .currentContext , opts . Common )
224+ cli .dockerEndpoint , err = resolveDockerEndpoint (cli .contextStore , cli .currentContext )
218225 if err != nil {
219226 return errors .Wrap (err , "unable to resolve docker endpoint" )
220227 }
@@ -252,12 +259,17 @@ func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions, ops ...Initialize
252259
253260// NewAPIClientFromFlags creates a new APIClient from command line flags
254261func NewAPIClientFromFlags (opts * cliflags.CommonOptions , configFile * configfile.ConfigFile ) (client.APIClient , error ) {
255- store := store .New (cliconfig .ContextStoreDir (), defaultContextStoreConfig ())
262+ store := & ContextStoreWithDefault {
263+ Store : store .New (cliconfig .ContextStoreDir (), defaultContextStoreConfig ()),
264+ Resolver : func () (* DefaultContext , error ) {
265+ return resolveDefaultContext (opts , configFile , ioutil .Discard )
266+ },
267+ }
256268 contextName , err := resolveContextName (opts , configFile , store )
257269 if err != nil {
258270 return nil , err
259271 }
260- endpoint , err := resolveDockerEndpoint (store , contextName , opts )
272+ endpoint , err := resolveDockerEndpoint (store , contextName )
261273 if err != nil {
262274 return nil , errors .Wrap (err , "unable to resolve docker endpoint" )
263275 }
@@ -278,18 +290,20 @@ func newAPIClientFromEndpoint(ep docker.Endpoint, configFile *configfile.ConfigF
278290 return client .NewClientWithOpts (clientOpts ... )
279291}
280292
281- func resolveDockerEndpoint (s store.Store , contextName string , opts * cliflags.CommonOptions ) (docker.Endpoint , error ) {
282- if contextName != "" {
283- ctxMeta , err := s .GetContextMetadata (contextName )
284- if err != nil {
285- return docker.Endpoint {}, err
286- }
287- epMeta , err := docker .EndpointFromContext (ctxMeta )
288- if err != nil {
289- return docker.Endpoint {}, err
290- }
291- return docker .WithTLSData (s , contextName , epMeta )
293+ func resolveDockerEndpoint (s store.Store , contextName string ) (docker.Endpoint , error ) {
294+ ctxMeta , err := s .GetContextMetadata (contextName )
295+ if err != nil {
296+ return docker.Endpoint {}, err
292297 }
298+ epMeta , err := docker .EndpointFromContext (ctxMeta )
299+ if err != nil {
300+ return docker.Endpoint {}, err
301+ }
302+ return docker .WithTLSData (s , contextName , epMeta )
303+ }
304+
305+ // Resolve the Docker endpoint for the default context (based on config, env vars and CLI flags)
306+ func resolveDefaultDockerEndpoint (opts * cliflags.CommonOptions ) (docker.Endpoint , error ) {
293307 host , err := getServerHost (opts .Hosts , opts .TLSOptions )
294308 if err != nil {
295309 return docker.Endpoint {}, err
@@ -384,38 +398,21 @@ func (cli *DockerCli) CurrentContext() string {
384398
385399// StackOrchestrator resolves which stack orchestrator is in use
386400func (cli * DockerCli ) StackOrchestrator (flagValue string ) (Orchestrator , error ) {
387- var ctxOrchestrator string
388-
389- configFile := cli .configFile
390- if configFile == nil {
391- configFile = cliconfig .LoadDefaultConfigFile (cli .Err ())
392- }
393-
394401 currentContext := cli .CurrentContext ()
395- if currentContext == "" {
396- currentContext = configFile .CurrentContext
402+ ctxRaw , err := cli .ContextStore ().GetContextMetadata (currentContext )
403+ if store .IsErrContextDoesNotExist (err ) {
404+ // case where the currentContext has been removed (CLI behavior is to fallback to using DOCKER_HOST based resolution)
405+ return GetStackOrchestrator (flagValue , "" , cli .ConfigFile ().StackOrchestrator , cli .Err ())
397406 }
398- if currentContext != "" {
399- contextstore := cli .contextStore
400- if contextstore == nil {
401- contextstore = store .New (cliconfig .ContextStoreDir (), cli .contextStoreConfig )
402- }
403- ctxRaw , err := contextstore .GetContextMetadata (currentContext )
404- if store .IsErrContextDoesNotExist (err ) {
405- // case where the currentContext has been removed (CLI behavior is to fallback to using DOCKER_HOST based resolution)
406- return GetStackOrchestrator (flagValue , "" , configFile .StackOrchestrator , cli .Err ())
407- }
408- if err != nil {
409- return "" , err
410- }
411- ctxMeta , err := GetDockerContext (ctxRaw )
412- if err != nil {
413- return "" , err
414- }
415- ctxOrchestrator = string (ctxMeta .StackOrchestrator )
407+ if err != nil {
408+ return "" , err
416409 }
417-
418- return GetStackOrchestrator (flagValue , ctxOrchestrator , configFile .StackOrchestrator , cli .Err ())
410+ ctxMeta , err := GetDockerContext (ctxRaw )
411+ if err != nil {
412+ return "" , err
413+ }
414+ ctxOrchestrator := string (ctxMeta .StackOrchestrator )
415+ return GetStackOrchestrator (flagValue , ctxOrchestrator , cli .ConfigFile ().StackOrchestrator , cli .Err ())
419416}
420417
421418// DockerEndpoint returns the current docker endpoint
@@ -511,10 +508,10 @@ func resolveContextName(opts *cliflags.CommonOptions, config *configfile.ConfigF
511508 return opts .Context , nil
512509 }
513510 if len (opts .Hosts ) > 0 {
514- return "" , nil
511+ return DefaultContextName , nil
515512 }
516513 if _ , present := os .LookupEnv ("DOCKER_HOST" ); present {
517- return "" , nil
514+ return DefaultContextName , nil
518515 }
519516 if ctxName , ok := os .LookupEnv ("DOCKER_CONTEXT" ); ok {
520517 return ctxName , nil
@@ -526,7 +523,7 @@ func resolveContextName(opts *cliflags.CommonOptions, config *configfile.ConfigF
526523 }
527524 return config .CurrentContext , err
528525 }
529- return "" , nil
526+ return DefaultContextName , nil
530527}
531528
532529func defaultContextStoreConfig () store.Config {
0 commit comments