github.com/hamo/docker@v1.11.1/api/client/version.go (about)

     1  package client
     2  
     3  import (
     4  	"runtime"
     5  	"text/template"
     6  	"time"
     7  
     8  	"golang.org/x/net/context"
     9  
    10  	Cli "github.com/docker/docker/cli"
    11  	"github.com/docker/docker/dockerversion"
    12  	flag "github.com/docker/docker/pkg/mflag"
    13  	"github.com/docker/docker/utils"
    14  	"github.com/docker/docker/utils/templates"
    15  	"github.com/docker/engine-api/types"
    16  )
    17  
    18  var versionTemplate = `Client:
    19   Version:      {{.Client.Version}}
    20   API version:  {{.Client.APIVersion}}
    21   Go version:   {{.Client.GoVersion}}
    22   Git commit:   {{.Client.GitCommit}}
    23   Built:        {{.Client.BuildTime}}
    24   OS/Arch:      {{.Client.Os}}/{{.Client.Arch}}{{if .Client.Experimental}}
    25   Experimental: {{.Client.Experimental}}{{end}}{{if .ServerOK}}
    26  
    27  Server:
    28   Version:      {{.Server.Version}}
    29   API version:  {{.Server.APIVersion}}
    30   Go version:   {{.Server.GoVersion}}
    31   Git commit:   {{.Server.GitCommit}}
    32   Built:        {{.Server.BuildTime}}
    33   OS/Arch:      {{.Server.Os}}/{{.Server.Arch}}{{if .Server.Experimental}}
    34   Experimental: {{.Server.Experimental}}{{end}}{{end}}`
    35  
    36  // CmdVersion shows Docker version information.
    37  //
    38  // Available version information is shown for: client Docker version, client API version, client Go version, client Git commit, client OS/Arch, server Docker version, server API version, server Go version, server Git commit, and server OS/Arch.
    39  //
    40  // Usage: docker version
    41  func (cli *DockerCli) CmdVersion(args ...string) (err error) {
    42  	cmd := Cli.Subcmd("version", nil, Cli.DockerCommands["version"].Description, true)
    43  	tmplStr := cmd.String([]string{"f", "#format", "-format"}, "", "Format the output using the given go template")
    44  	cmd.Require(flag.Exact, 0)
    45  
    46  	cmd.ParseFlags(args, true)
    47  
    48  	templateFormat := versionTemplate
    49  	if *tmplStr != "" {
    50  		templateFormat = *tmplStr
    51  	}
    52  
    53  	var tmpl *template.Template
    54  	if tmpl, err = templates.Parse(templateFormat); err != nil {
    55  		return Cli.StatusError{StatusCode: 64,
    56  			Status: "Template parsing error: " + err.Error()}
    57  	}
    58  
    59  	vd := types.VersionResponse{
    60  		Client: &types.Version{
    61  			Version:      dockerversion.Version,
    62  			APIVersion:   cli.client.ClientVersion(),
    63  			GoVersion:    runtime.Version(),
    64  			GitCommit:    dockerversion.GitCommit,
    65  			BuildTime:    dockerversion.BuildTime,
    66  			Os:           runtime.GOOS,
    67  			Arch:         runtime.GOARCH,
    68  			Experimental: utils.ExperimentalBuild(),
    69  		},
    70  	}
    71  
    72  	serverVersion, err := cli.client.ServerVersion(context.Background())
    73  	if err == nil {
    74  		vd.Server = &serverVersion
    75  	}
    76  
    77  	// first we need to make BuildTime more human friendly
    78  	t, errTime := time.Parse(time.RFC3339Nano, vd.Client.BuildTime)
    79  	if errTime == nil {
    80  		vd.Client.BuildTime = t.Format(time.ANSIC)
    81  	}
    82  
    83  	if vd.ServerOK() {
    84  		t, errTime = time.Parse(time.RFC3339Nano, vd.Server.BuildTime)
    85  		if errTime == nil {
    86  			vd.Server.BuildTime = t.Format(time.ANSIC)
    87  		}
    88  	}
    89  
    90  	if err2 := tmpl.Execute(cli.out, vd); err2 != nil && err == nil {
    91  		err = err2
    92  	}
    93  	cli.out.Write([]byte{'\n'})
    94  	return err
    95  }