diff --git a/cli/command/system/version.go b/cli/command/system/version.go index 9cca599fe3..0cb5b6968f 100644 --- a/cli/command/system/version.go +++ b/cli/command/system/version.go @@ -1,34 +1,49 @@ package system import ( + "fmt" "runtime" "time" - "golang.org/x/net/context" - "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" "github.com/docker/cli/templates" "github.com/docker/docker/api/types" "github.com/spf13/cobra" + "golang.org/x/net/context" ) -var versionTemplate = `Client: - Version: {{.Client.Version}} - 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}} - OS/Arch: {{.Client.Os}}/{{.Client.Arch}}{{if .ServerOK}} +var versionTemplate = `{{with .Client -}} +Client:{{if ne .Platform.Name ""}} {{.Platform.Name}}{{end}} + Version: {{.Version}} + API version: {{.APIVersion}}{{if ne .APIVersion .DefaultAPIVersion}} (downgraded from {{.DefaultAPIVersion}}){{end}} + Go version: {{.GoVersion}} + Git commit: {{.GitCommit}} + Built: {{.BuildTime}} + OS/Arch: {{.Os}}/{{.Arch}} +{{- end}} -Server: - Version: {{.Server.Version}} - API version: {{.Server.APIVersion}} (minimum version {{.Server.MinAPIVersion}}) - Go version: {{.Server.GoVersion}} - Git commit: {{.Server.GitCommit}} - Built: {{.Server.BuildTime}} - OS/Arch: {{.Server.Os}}/{{.Server.Arch}} - Experimental: {{.Server.Experimental}}{{end}}` +{{- if .ServerOK}}{{with .Server}} + +Server:{{if ne .Platform.Name ""}} {{.Platform.Name}}{{end}} + {{- range $component := .Components}} + {{$component.Name}}: + {{- if eq $component.Name "Engine" }} + Version: {{.Version}} + API version: {{index .Details "ApiVersion"}} (minimum version {{index .Details "MinAPIVersion"}}) + Go version: {{index .Details "GoVersion"}} + Git commit: {{index .Details "GitCommit"}} + Built: {{index .Details "BuildTime"}} + OS/Arch: {{index .Details "Os"}}/{{index .Details "Arch"}} + Experimental: {{index .Details "Experimental"}} + {{- else -}} + Version: {{$component.Version}} + {{- range $k, $v := $component.Details}} + {{$k}}: {{$v}} + {{- end}} + {{- end}} + {{- end}} +{{- end}}{{end}}` type versionOptions struct { format string @@ -41,6 +56,8 @@ type versionInfo struct { } type clientVersion struct { + Platform struct{ Name string } `json:",omitempty"` + Version string APIVersion string `json:"ApiVersion"` DefaultAPIVersion string `json:"DefaultAPIVersion,omitempty"` @@ -77,6 +94,14 @@ func NewVersionCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } +func reformatDate(buildTime string) string { + t, errTime := time.Parse(time.RFC3339Nano, buildTime) + if errTime == nil { + return t.Format(time.ANSIC) + } + return buildTime +} + func runVersion(dockerCli *command.DockerCli, opts *versionOptions) error { ctx := context.Background() @@ -103,22 +128,41 @@ func runVersion(dockerCli *command.DockerCli, opts *versionOptions) error { Arch: runtime.GOARCH, }, } - - serverVersion, err := dockerCli.Client().ServerVersion(ctx) - if err == nil { - vd.Server = &serverVersion - } + vd.Client.Platform.Name = cli.PlatformName // first we need to make BuildTime more human friendly - t, errTime := time.Parse(time.RFC3339Nano, vd.Client.BuildTime) - if errTime == nil { - vd.Client.BuildTime = t.Format(time.ANSIC) - } + vd.Client.BuildTime = reformatDate(vd.Client.BuildTime) - if vd.ServerOK() { - t, errTime = time.Parse(time.RFC3339Nano, vd.Server.BuildTime) - if errTime == nil { - vd.Server.BuildTime = t.Format(time.ANSIC) + sv, err := dockerCli.Client().ServerVersion(ctx) + if err == nil { + vd.Server = &sv + foundEngine := false + for _, component := range sv.Components { + if component.Name == "Engine" { + foundEngine = true + buildTime, ok := component.Details["BuildTime"] + if ok { + component.Details["BuildTime"] = reformatDate(buildTime) + } + break + } + } + + if !foundEngine { + vd.Server.Components = append(vd.Server.Components, types.ComponentVersion{ + Name: "Engine", + Version: sv.Version, + Details: map[string]string{ + "ApiVersion": sv.APIVersion, + "MinAPIVersion": sv.MinAPIVersion, + "GitCommit": sv.GitCommit, + "GoVersion": sv.GoVersion, + "Os": sv.Os, + "Arch": sv.Arch, + "BuildTime": reformatDate(vd.Server.BuildTime), + "Experimental": fmt.Sprintf("%t", sv.Experimental), + }, + }) } } diff --git a/cli/version.go b/cli/version.go index bff7ab49ef..91c9ae1878 100644 --- a/cli/version.go +++ b/cli/version.go @@ -3,7 +3,8 @@ package cli // Default build-time variable. // These values are overriding via ldflags var ( - Version = "unknown-version" - GitCommit = "unknown-commit" - BuildTime = "unknown-buildtime" + PlatformName = "" + Version = "unknown-version" + GitCommit = "unknown-commit" + BuildTime = "unknown-buildtime" ) diff --git a/docker.Makefile b/docker.Makefile index f3f9afed4e..04ce309636 100644 --- a/docker.Makefile +++ b/docker.Makefile @@ -10,7 +10,7 @@ CROSS_IMAGE_NAME = docker-cli-cross$(IMAGE_TAG) VALIDATE_IMAGE_NAME = docker-cli-shell-validate$(IMAGE_TAG) MOUNTS = -v "$(CURDIR)":/go/src/github.com/docker/cli VERSION = $(shell cat VERSION) -ENVVARS = -e VERSION=$(VERSION) -e GITCOMMIT +ENVVARS = -e VERSION=$(VERSION) -e GITCOMMIT -e PLATFORM # build docker image (dockerfiles/Dockerfile.build) .PHONY: build_docker_image diff --git a/scripts/build/.variables b/scripts/build/.variables index eb87c38268..208f44c316 100755 --- a/scripts/build/.variables +++ b/scripts/build/.variables @@ -1,15 +1,22 @@ #!/usr/bin/env bash set -eu +PLATFORM=${PLATFORM:-} VERSION=${VERSION:-"unknown-version"} GITCOMMIT=${GITCOMMIT:-$(git rev-parse --short HEAD 2> /dev/null || true)} BUILDTIME=${BUILDTIME:-$(date --utc --rfc-3339 ns 2> /dev/null | sed -e 's/ /T/')} +PLATFORM_LDFLAGS= +if test -n "${PLATFORM}"; then + PLATFORM_LDFLAGS="-X \"github.com/docker/cli/cli.PlatformName=${PLATFORM}\"" +fi + export LDFLAGS="\ -w \ - -X github.com/docker/cli/cli.GitCommit=${GITCOMMIT} \ - -X github.com/docker/cli/cli.BuildTime=${BUILDTIME} \ - -X github.com/docker/cli/cli.Version=${VERSION} \ + ${PLATFORM_LDFLAGS} \ + -X \"github.com/docker/cli/cli.GitCommit=${GITCOMMIT}\" \ + -X \"github.com/docker/cli/cli.BuildTime=${BUILDTIME}\" \ + -X \"github.com/docker/cli/cli.Version=${VERSION}\" \ ${LDFLAGS:-} \ "