github.com/hustcat/docker@v1.3.3-0.20160314103604-901c67a8eeab/api/client/version.go (about)

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