-
Notifications
You must be signed in to change notification settings - Fork 2k
Description
Description
The Docker CLI defaults to using a local daemon through a unix-socket (Linux, macOS) or named pipe (Windows), but it can be configured to use a different connection, which can be a remote machine.
There's various ways to configure the CLI; (also see DockerCli.CurrentContext);
DOCKER_HOST
(takes precedence over context)--host
/-H
(configures the connection to use)DOCKER_CONTEXT
(configure the context, which is used to configure the connection)--context
(configure the context, which is used to configure the connection)currentContext
field in~/.docker/config.json
(configures the default context to configure the connection)- In rootless-mode, other env-vars may be involved for the default socket path.
Some of these options may not be very visible; we have some warnings when performing docker context
operations to inform the user that DOCKER_HOST
is set (and overrides the selected context);
cli/cli/command/context/list.go
Lines 110 to 113 in 1d768f8
if os.Getenv(client.EnvOverrideHost) != "" { | |
_, _ = fmt.Fprintf(dockerCli.Err(), "Warning: %[1]s environment variable overrides the active context. "+ | |
"To use a context, either set the global --context flag, or unset %[1]s environment variable.\n", client.EnvOverrideHost) | |
} |
cli/cli/command/context/use.go
Lines 52 to 55 in 1d768f8
if name != command.DefaultContextName && os.Getenv(client.EnvOverrideHost) != "" { | |
_, _ = fmt.Fprintf(dockerCLI.Err(), "Warning: %[1]s environment variable overrides the active context. "+ | |
"To use %[2]q, either set the global --context flag, or unset %[1]s environment variable.\n", client.EnvOverrideHost, name) | |
} |
However, other places may not show this information. Most notably docker version
and docker info
;
Current context (in the CLI's config) is desktop-linux
;
cat ~/.docker/config.json | jq .currentContext
"desktop-linux"
However, docker version
shows that the default
context is used;
docker version
Client:
Version: 28.3.0-rc.1
API version: 1.42 (downgraded from 1.51)
Go version: go1.24.4
Git commit: f53bb88
Built: Fri Jun 13 18:25:06 2025
OS/Arch: darwin/arm64
Context: default
And docker info
does the same;
docker info | head -n 5
Client:
Version: 28.3.0-rc.1
Context: default
Debug Mode: false
Plugins:
In the above situation, the reason was that DOCKER_HOST
was set in the current shell;
env | grep DOCKER
DOCKER_HOST=ssh://swarm-test-01/var/run/docker.sock
Improvement: make active connection more visible
1. Include "Docker Host" in docker version
and docker info
We can include the active host in output of docker version
and docker info
;
docker version
Client:
Version: 28.3.0-rc.1
API version: 1.42 (downgraded from 1.51)
Go version: go1.24.4
Git commit: f53bb88
Built: Fri Jun 13 18:25:06 2025
OS/Arch: darwin/arm64
Context: default
Docker Host: ssh://swarm-test-01/var/run/docker.sock
docker info | head -n 5
Client:
Version: 28.3.0-rc.1
Context: default
Docker Host: ssh://swarm-test-01/var/run/docker.sock
Debug Mode: false
- ☝️ alternatively, we could include this in the
Server
section, however, theServer
itself may be serving the API on multiple "hosts" (e.g. both on a socket AND through tcp); api: add "Listeners" field to /info, to help discover how the API is exposed moby/moby#43459
2. Show what determined the active context
We can show "why" the given context is used, e.g.;
Context: default (context disabled because DOCKER_HOST is set)
Context: desktop-linux (from DOCKER_CONTEXT)
Context: desktop-linux (from "~/.docker/config.json`)
docker version | grep 'Context:'
);
- Generally, users should use
docker context show
for this, but it may be a breaking change - When formatting, we should make this a separate part of the template so that
docker version --format '{{.Client.Context}}'
only shows the context name (same for `docker info --format``)
3. Show what determined the active "host" connection
Similar to the above; show where the connection string came from;
Docker Host: ssh://swarm-test-01/var/run/docker.sock (from DOCKER_HOST)
❓ should we also show if this comes from the active context? (when not overridden by DOCKER_HOST
)? Or is that just "noise"?
Docker Host: ssh://swarm-test-01/var/run/docker.sock (from "desktop-linux" context)
or
Docker Host: ssh://swarm-test-01/var/run/docker.sock (from current context)