@@ -59,7 +59,9 @@ type Cli interface {
5959}
6060
6161// DockerCli is an instance the docker command line client.
62- // Instances of the client can be returned from NewDockerCli.
62+ // Instances of the client should be created using the [NewDockerCli]
63+ // constructor to make sure they are properly initialized with defaults
64+ // set.
6365type DockerCli struct {
6466 configFile * configfile.ConfigFile
6567 options * cliflags.ClientOptions
@@ -74,7 +76,7 @@ type DockerCli struct {
7476 init sync.Once
7577 initErr error
7678 dockerEndpoint docker.Endpoint
77- contextStoreConfig store.Config
79+ contextStoreConfig * store.Config
7880 initTimeout time.Duration
7981 res telemetryResource
8082
@@ -250,13 +252,33 @@ func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions, ops ...CLIOption)
250252 return errors .New ("conflicting options: cannot specify both --host and --context" )
251253 }
252254
255+ if cli .contextStoreConfig == nil {
256+ // This path can be hit when calling Initialize on a DockerCli that's
257+ // not constructed through [NewDockerCli]. Using the default context
258+ // store without a config set will result in Endpoints from contexts
259+ // not being type-mapped correctly, and used as a generic "map[string]any",
260+ // instead of a [docker.EndpointMeta].
261+ //
262+ // When looking up the API endpoint (using [EndpointFromContext]), no
263+ // endpoint will be found, and a default, empty endpoint will be used
264+ // instead which in its turn, causes newAPIClientFromEndpoint to
265+ // be initialized with the default config instead of settings for
266+ // the current context (which may mean; connecting with the wrong
267+ // endpoint and/or TLS Config to be missing).
268+ //
269+ // [EndpointFromContext]: https://github.com/docker/cli/blob/33494921b80fd0b5a06acc3a34fa288de4bb2e6b/cli/context/docker/load.go#L139-L149
270+ if err := WithDefaultContextStoreConfig ()(cli ); err != nil {
271+ return err
272+ }
273+ }
274+
253275 cli .options = opts
254276 cli .configFile = config .LoadDefaultConfigFile (cli .err )
255277 cli .currentContext = resolveContextName (cli .options , cli .configFile )
256278 cli .contextStore = & ContextStoreWithDefault {
257- Store : store .New (config .ContextStoreDir (), cli .contextStoreConfig ),
279+ Store : store .New (config .ContextStoreDir (), * cli .contextStoreConfig ),
258280 Resolver : func () (* DefaultContext , error ) {
259- return ResolveDefaultContext (cli .options , cli .contextStoreConfig )
281+ return ResolveDefaultContext (cli .options , * cli .contextStoreConfig )
260282 },
261283 }
262284
0 commit comments