From 1b140377f06cbd16249bca2bece495dd7c500e2c Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Tue, 21 Jun 2016 09:15:17 +0000 Subject: [PATCH] add `--format` flag to `docker info` Signed-off-by: Akihiro Suda Upstream-commit: dc38c9a04705f0a9ad3e007f7869cfb6a8a3a8b8 Component: engine --- components/engine/api/client/system/info.go | 35 +++++++++++++++++-- .../engine/contrib/completion/bash/docker | 8 ++++- .../contrib/completion/fish/docker.fish | 4 +++ .../engine/contrib/completion/zsh/_docker | 3 +- .../engine/docs/reference/commandline/info.md | 12 ++++++- .../integration-cli/docker_cli_info_test.go | 12 +++++++ components/engine/man/docker-info.1.md | 14 +++++++- 7 files changed, 81 insertions(+), 7 deletions(-) diff --git a/components/engine/api/client/system/info.go b/components/engine/api/client/system/info.go index 7491fae166..cec6c6ddff 100644 --- a/components/engine/api/client/system/info.go +++ b/components/engine/api/client/system/info.go @@ -11,32 +11,50 @@ import ( "github.com/docker/docker/cli" "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/utils" + "github.com/docker/docker/utils/templates" + "github.com/docker/engine-api/types" "github.com/docker/engine-api/types/swarm" "github.com/docker/go-units" "github.com/spf13/cobra" ) +type infoOptions struct { + format string +} + // NewInfoCommand creates a new cobra.Command for `docker info` func NewInfoCommand(dockerCli *client.DockerCli) *cobra.Command { + var opts infoOptions + cmd := &cobra.Command{ Use: "info", Short: "Display system-wide information", Args: cli.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - return runInfo(dockerCli) + return runInfo(dockerCli, &opts) }, } - return cmd + flags := cmd.Flags() + + flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given go template") + + return cmd } -func runInfo(dockerCli *client.DockerCli) error { +func runInfo(dockerCli *client.DockerCli, opts *infoOptions) error { ctx := context.Background() info, err := dockerCli.Client().Info(ctx) if err != nil { return err } + if opts.format == "" { + return prettyPrintInfo(dockerCli, info) + } + return formatInfo(dockerCli, info, opts.format) +} +func prettyPrintInfo(dockerCli *client.DockerCli, info types.Info) error { fmt.Fprintf(dockerCli.Out(), "Containers: %d\n", info.Containers) fmt.Fprintf(dockerCli.Out(), " Running: %d\n", info.ContainersRunning) fmt.Fprintf(dockerCli.Out(), " Paused: %d\n", info.ContainersPaused) @@ -223,3 +241,14 @@ func runInfo(dockerCli *client.DockerCli) error { return nil } + +func formatInfo(dockerCli *client.DockerCli, info types.Info, format string) error { + tmpl, err := templates.Parse(format) + if err != nil { + return cli.StatusError{StatusCode: 64, + Status: "Template parsing error: " + err.Error()} + } + err = tmpl.Execute(dockerCli.Out(), info) + dockerCli.Out().Write([]byte{'\n'}) + return err +} diff --git a/components/engine/contrib/completion/bash/docker b/components/engine/contrib/completion/bash/docker index 0ded2a0c2c..90c08112a5 100644 --- a/components/engine/contrib/completion/bash/docker +++ b/components/engine/contrib/completion/bash/docker @@ -1290,9 +1290,15 @@ _docker_import() { } _docker_info() { + case "$prev" in + --format|-f) + return + ;; + esac + case "$cur" in -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) ;; esac } diff --git a/components/engine/contrib/completion/fish/docker.fish b/components/engine/contrib/completion/fish/docker.fish index 72ccd05533..2ee367ff30 100644 --- a/components/engine/contrib/completion/fish/docker.fish +++ b/components/engine/contrib/completion/fish/docker.fish @@ -200,6 +200,8 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from import' -l help -d 'Pri # info complete -c docker -f -n '__fish_docker_no_subcommand' -a info -d 'Display system-wide information' +complete -c docker -A -f -n '__fish_seen_subcommand_from info' -s f -l format -d 'Format the output using the given go template' +complete -c docker -A -f -n '__fish_seen_subcommand_from info' -l help -d 'Print usage' # inspect complete -c docker -f -n '__fish_docker_no_subcommand' -a inspect -d 'Return low-level information on a container or image' @@ -393,6 +395,8 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from unpause' -a '(__fish_pr # version complete -c docker -f -n '__fish_docker_no_subcommand' -a version -d 'Show the Docker version information' +complete -c docker -A -f -n '__fish_seen_subcommand_from version' -s f -l format -d 'Format the output using the given go template' +complete -c docker -A -f -n '__fish_seen_subcommand_from version' -l help -d 'Print usage' # wait complete -c docker -f -n '__fish_docker_no_subcommand' -a wait -d 'Block until a container stops, then print its exit code' diff --git a/components/engine/contrib/completion/zsh/_docker b/components/engine/contrib/completion/zsh/_docker index c8a3394274..d09445bf71 100644 --- a/components/engine/contrib/completion/zsh/_docker +++ b/components/engine/contrib/completion/zsh/_docker @@ -1709,7 +1709,8 @@ __docker_subcommand() { ;; (info|version) _arguments $(__docker_arguments) \ - $opts_help && ret=0 + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 ;; (inspect) local state diff --git a/components/engine/docs/reference/commandline/info.md b/components/engine/docs/reference/commandline/info.md index f62add6603..00d5b935c1 100644 --- a/components/engine/docs/reference/commandline/info.md +++ b/components/engine/docs/reference/commandline/info.md @@ -16,7 +16,8 @@ Usage: docker info Display system-wide information Options: - --help Print usage + -f, --format string Format the output using the given go template + --help Print usage ``` This command displays system wide information regarding the Docker installation. @@ -24,6 +25,10 @@ Information displayed includes the kernel version, number of containers and imag The number of images shown is the number of unique images. The same image tagged under different names is counted only once. +If a format is specified, the given template will be executed instead of the +default format. Go's [text/template](http://golang.org/pkg/text/template/) package +describes all the details of the format. + Depending on the storage driver in use, additional information can be shown, such as pool name, data file, metadata file, data space used, total data space, metadata space used, and total metadata space. @@ -144,3 +149,8 @@ information about the devicemapper storage driver is shown: Insecure registries: myinsecurehost:5000 127.0.0.0/8 + +You can also specify the output format: + + $ docker info --format '{{json .}}' + {"ID":"I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S","Containers":14, ...} diff --git a/components/engine/integration-cli/docker_cli_info_test.go b/components/engine/integration-cli/docker_cli_info_test.go index 628cb51313..ac0c037cda 100644 --- a/components/engine/integration-cli/docker_cli_info_test.go +++ b/components/engine/integration-cli/docker_cli_info_test.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "net" "strings" @@ -49,6 +50,17 @@ func (s *DockerSuite) TestInfoEnsureSucceeds(c *check.C) { } } +// TestInfoFormat tests `docker info --format` +func (s *DockerSuite) TestInfoFormat(c *check.C) { + out, status := dockerCmd(c, "info", "--format", "{{json .}}") + c.Assert(status, checker.Equals, 0) + var m map[string]interface{} + err := json.Unmarshal([]byte(out), &m) + c.Assert(err, checker.IsNil) + _, _, err = dockerCmdWithError("info", "--format", "{{.badString}}") + c.Assert(err, checker.NotNil) +} + // TestInfoDiscoveryBackend verifies that a daemon run with `--cluster-advertise` and // `--cluster-store` properly show the backend's endpoint in info output. func (s *DockerSuite) TestInfoDiscoveryBackend(c *check.C) { diff --git a/components/engine/man/docker-info.1.md b/components/engine/man/docker-info.1.md index 1d96b562eb..810b215363 100644 --- a/components/engine/man/docker-info.1.md +++ b/components/engine/man/docker-info.1.md @@ -7,7 +7,7 @@ docker-info - Display system-wide information # SYNOPSIS **docker info** [**--help**] - +[**-f**|**--format**[=*FORMAT*]] # DESCRIPTION This command displays system wide information regarding the Docker installation. @@ -15,6 +15,10 @@ Information displayed includes the kernel version, number of containers and imag The number of images shown is the number of unique images. The same image tagged under different names is counted only once. +If a format is specified, the given template will be executed instead of the +default format. Go's **text/template** package +describes all the details of the format. + Depending on the storage driver in use, additional information can be shown, such as pool name, data file, metadata file, data space used, total data space, metadata space used, and total metadata space. @@ -28,6 +32,9 @@ available on the volume where `/var/lib/docker` is mounted. **--help** Print usage statement +**-f**, **--format**="" + Format the output using the given go template + # EXAMPLES ## Display Docker system information @@ -140,6 +147,11 @@ information about the devicemapper storage driver is shown: myinsecurehost:5000 127.0.0.0/8 +You can also specify the output format: + + $ docker info --format '{{json .}}' + {"ID":"I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S","Containers":14, ...} + # HISTORY April 2014, Originally compiled by William Henry (whenry at redhat dot com) based on docker.com source material and internal work.