Docker version output is not consistent when there are downgrades or incompatibilities.
package system
import (
- "fmt"
"runtime"
"time"
@@ -17,7 +16,7 @@ import (
var versionTemplate = `Client:
Version: {{.Client.Version}}
- API version: {{.Client.APIVersion}}
+ API version: {{.Client.APIVersion}}{{if ne .Client.APIVersion .Client.DefaultAPIVersion}} (downgraded from {{.Client.DefaultAPIVersion}}){{end}}
Go version: {{.Client.GoVersion}}
Git commit: {{.Client.GitCommit}}
Built: {{.Client.BuildTime}}
@@ -36,6 +35,29 @@ type versionOptions struct {
format string
}
+// versionInfo contains version information of both the Client, and Server
+type versionInfo struct {
+ Client clientVersion
+ Server *types.Version
+}
+
+type clientVersion struct {
+ Version string
+ APIVersion string `json:"ApiVersion"`
+ DefaultAPIVersion string `json:"DefaultAPIVersion,omitempty"`
+ GitCommit string
+ GoVersion string
+ Os string
+ Arch string
+ BuildTime string `json:",omitempty"`
+}
+
+// ServerOK returns true when the client could connect to the docker server
+// and parse the information received. It returns false otherwise.
+func (v versionInfo) ServerOK() bool {
+ return v.Server != nil
+}
+
// NewVersionCommand creates a new cobra.Command for `docker version`
func NewVersionCommand(dockerCli *command.DockerCli) *cobra.Command {
var opts versionOptions
@@ -70,15 +92,11 @@ func runVersion(dockerCli *command.DockerCli, opts *versionOptions) error {
Status: "Template parsing error: " + err.Error()}
}
- APIVersion := dockerCli.Client().ClientVersion()
- if defaultAPIVersion := dockerCli.DefaultVersion(); APIVersion != defaultAPIVersion {
- APIVersion = fmt.Sprintf("%s (downgraded from %s)", APIVersion, defaultAPIVersion)
- }
-
- vd := types.VersionResponse{
- Client: &types.Version{
+ vd := versionInfo{
+ Client: clientVersion{
Version: dockerversion.Version,
- APIVersion: APIVersion,
+ APIVersion: dockerCli.Client().ClientVersion(),
+ DefaultAPIVersion: dockerCli.DefaultVersion(),
GoVersion: runtime.Version(),
GitCommit: dockerversion.GitCommit,
BuildTime: dockerversion.BuildTime,
