Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
| ... | ... |
@@ -11,32 +11,50 @@ import ( |
| 11 | 11 |
"github.com/docker/docker/cli" |
| 12 | 12 |
"github.com/docker/docker/pkg/ioutils" |
| 13 | 13 |
"github.com/docker/docker/utils" |
| 14 |
+ "github.com/docker/docker/utils/templates" |
|
| 15 |
+ "github.com/docker/engine-api/types" |
|
| 14 | 16 |
"github.com/docker/engine-api/types/swarm" |
| 15 | 17 |
"github.com/docker/go-units" |
| 16 | 18 |
"github.com/spf13/cobra" |
| 17 | 19 |
) |
| 18 | 20 |
|
| 21 |
+type infoOptions struct {
|
|
| 22 |
+ format string |
|
| 23 |
+} |
|
| 24 |
+ |
|
| 19 | 25 |
// NewInfoCommand creates a new cobra.Command for `docker info` |
| 20 | 26 |
func NewInfoCommand(dockerCli *client.DockerCli) *cobra.Command {
|
| 27 |
+ var opts infoOptions |
|
| 28 |
+ |
|
| 21 | 29 |
cmd := &cobra.Command{
|
| 22 | 30 |
Use: "info", |
| 23 | 31 |
Short: "Display system-wide information", |
| 24 | 32 |
Args: cli.NoArgs, |
| 25 | 33 |
RunE: func(cmd *cobra.Command, args []string) error {
|
| 26 |
- return runInfo(dockerCli) |
|
| 34 |
+ return runInfo(dockerCli, &opts) |
|
| 27 | 35 |
}, |
| 28 | 36 |
} |
| 29 |
- return cmd |
|
| 30 | 37 |
|
| 38 |
+ flags := cmd.Flags() |
|
| 39 |
+ |
|
| 40 |
+ flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given go template") |
|
| 41 |
+ |
|
| 42 |
+ return cmd |
|
| 31 | 43 |
} |
| 32 | 44 |
|
| 33 |
-func runInfo(dockerCli *client.DockerCli) error {
|
|
| 45 |
+func runInfo(dockerCli *client.DockerCli, opts *infoOptions) error {
|
|
| 34 | 46 |
ctx := context.Background() |
| 35 | 47 |
info, err := dockerCli.Client().Info(ctx) |
| 36 | 48 |
if err != nil {
|
| 37 | 49 |
return err |
| 38 | 50 |
} |
| 51 |
+ if opts.format == "" {
|
|
| 52 |
+ return prettyPrintInfo(dockerCli, info) |
|
| 53 |
+ } |
|
| 54 |
+ return formatInfo(dockerCli, info, opts.format) |
|
| 55 |
+} |
|
| 39 | 56 |
|
| 57 |
+func prettyPrintInfo(dockerCli *client.DockerCli, info types.Info) error {
|
|
| 40 | 58 |
fmt.Fprintf(dockerCli.Out(), "Containers: %d\n", info.Containers) |
| 41 | 59 |
fmt.Fprintf(dockerCli.Out(), " Running: %d\n", info.ContainersRunning) |
| 42 | 60 |
fmt.Fprintf(dockerCli.Out(), " Paused: %d\n", info.ContainersPaused) |
| ... | ... |
@@ -223,3 +241,14 @@ func runInfo(dockerCli *client.DockerCli) error {
|
| 223 | 223 |
|
| 224 | 224 |
return nil |
| 225 | 225 |
} |
| 226 |
+ |
|
| 227 |
+func formatInfo(dockerCli *client.DockerCli, info types.Info, format string) error {
|
|
| 228 |
+ tmpl, err := templates.Parse(format) |
|
| 229 |
+ if err != nil {
|
|
| 230 |
+ return cli.StatusError{StatusCode: 64,
|
|
| 231 |
+ Status: "Template parsing error: " + err.Error()} |
|
| 232 |
+ } |
|
| 233 |
+ err = tmpl.Execute(dockerCli.Out(), info) |
|
| 234 |
+ dockerCli.Out().Write([]byte{'\n'})
|
|
| 235 |
+ return err |
|
| 236 |
+} |
| ... | ... |
@@ -1290,9 +1290,15 @@ _docker_import() {
|
| 1290 | 1290 |
} |
| 1291 | 1291 |
|
| 1292 | 1292 |
_docker_info() {
|
| 1293 |
+ case "$prev" in |
|
| 1294 |
+ --format|-f) |
|
| 1295 |
+ return |
|
| 1296 |
+ ;; |
|
| 1297 |
+ esac |
|
| 1298 |
+ |
|
| 1293 | 1299 |
case "$cur" in |
| 1294 | 1300 |
-*) |
| 1295 |
- COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) |
|
| 1301 |
+ COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) |
|
| 1296 | 1302 |
;; |
| 1297 | 1303 |
esac |
| 1298 | 1304 |
} |
| ... | ... |
@@ -200,6 +200,8 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from import' -l help -d 'Pri |
| 200 | 200 |
|
| 201 | 201 |
# info |
| 202 | 202 |
complete -c docker -f -n '__fish_docker_no_subcommand' -a info -d 'Display system-wide information' |
| 203 |
+complete -c docker -A -f -n '__fish_seen_subcommand_from info' -s f -l format -d 'Format the output using the given go template' |
|
| 204 |
+complete -c docker -A -f -n '__fish_seen_subcommand_from info' -l help -d 'Print usage' |
|
| 203 | 205 |
|
| 204 | 206 |
# inspect |
| 205 | 207 |
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 |
| 393 | 393 |
|
| 394 | 394 |
# version |
| 395 | 395 |
complete -c docker -f -n '__fish_docker_no_subcommand' -a version -d 'Show the Docker version information' |
| 396 |
+complete -c docker -A -f -n '__fish_seen_subcommand_from version' -s f -l format -d 'Format the output using the given go template' |
|
| 397 |
+complete -c docker -A -f -n '__fish_seen_subcommand_from version' -l help -d 'Print usage' |
|
| 396 | 398 |
|
| 397 | 399 |
# wait |
| 398 | 400 |
complete -c docker -f -n '__fish_docker_no_subcommand' -a wait -d 'Block until a container stops, then print its exit code' |
| ... | ... |
@@ -1709,7 +1709,8 @@ __docker_subcommand() {
|
| 1709 | 1709 |
;; |
| 1710 | 1710 |
(info|version) |
| 1711 | 1711 |
_arguments $(__docker_arguments) \ |
| 1712 |
- $opts_help && ret=0 |
|
| 1712 |
+ $opts_help \ |
|
| 1713 |
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0
|
|
| 1713 | 1714 |
;; |
| 1714 | 1715 |
(inspect) |
| 1715 | 1716 |
local state |
| ... | ... |
@@ -16,7 +16,8 @@ Usage: docker info |
| 16 | 16 |
Display system-wide information |
| 17 | 17 |
|
| 18 | 18 |
Options: |
| 19 |
- --help Print usage |
|
| 19 |
+ -f, --format string Format the output using the given go template |
|
| 20 |
+ --help Print usage |
|
| 20 | 21 |
``` |
| 21 | 22 |
|
| 22 | 23 |
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 |
| 24 | 24 |
The number of images shown is the number of unique images. The same image tagged |
| 25 | 25 |
under different names is counted only once. |
| 26 | 26 |
|
| 27 |
+If a format is specified, the given template will be executed instead of the |
|
| 28 |
+default format. Go's [text/template](http://golang.org/pkg/text/template/) package |
|
| 29 |
+describes all the details of the format. |
|
| 30 |
+ |
|
| 27 | 31 |
Depending on the storage driver in use, additional information can be shown, such |
| 28 | 32 |
as pool name, data file, metadata file, data space used, total data space, metadata |
| 29 | 33 |
space used, and total metadata space. |
| ... | ... |
@@ -144,3 +149,8 @@ information about the devicemapper storage driver is shown: |
| 144 | 144 |
Insecure registries: |
| 145 | 145 |
myinsecurehost:5000 |
| 146 | 146 |
127.0.0.0/8 |
| 147 |
+ |
|
| 148 |
+You can also specify the output format: |
|
| 149 |
+ |
|
| 150 |
+ $ docker info --format '{{json .}}'
|
|
| 151 |
+ {"ID":"I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S","Containers":14, ...}
|
| ... | ... |
@@ -1,6 +1,7 @@ |
| 1 | 1 |
package main |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
+ "encoding/json" |
|
| 4 | 5 |
"fmt" |
| 5 | 6 |
"net" |
| 6 | 7 |
"strings" |
| ... | ... |
@@ -49,6 +50,17 @@ func (s *DockerSuite) TestInfoEnsureSucceeds(c *check.C) {
|
| 49 | 49 |
} |
| 50 | 50 |
} |
| 51 | 51 |
|
| 52 |
+// TestInfoFormat tests `docker info --format` |
|
| 53 |
+func (s *DockerSuite) TestInfoFormat(c *check.C) {
|
|
| 54 |
+ out, status := dockerCmd(c, "info", "--format", "{{json .}}")
|
|
| 55 |
+ c.Assert(status, checker.Equals, 0) |
|
| 56 |
+ var m map[string]interface{}
|
|
| 57 |
+ err := json.Unmarshal([]byte(out), &m) |
|
| 58 |
+ c.Assert(err, checker.IsNil) |
|
| 59 |
+ _, _, err = dockerCmdWithError("info", "--format", "{{.badString}}")
|
|
| 60 |
+ c.Assert(err, checker.NotNil) |
|
| 61 |
+} |
|
| 62 |
+ |
|
| 52 | 63 |
// TestInfoDiscoveryBackend verifies that a daemon run with `--cluster-advertise` and |
| 53 | 64 |
// `--cluster-store` properly show the backend's endpoint in info output. |
| 54 | 65 |
func (s *DockerSuite) TestInfoDiscoveryBackend(c *check.C) {
|
| ... | ... |
@@ -7,7 +7,7 @@ docker-info - Display system-wide information |
| 7 | 7 |
# SYNOPSIS |
| 8 | 8 |
**docker info** |
| 9 | 9 |
[**--help**] |
| 10 |
- |
|
| 10 |
+[**-f**|**--format**[=*FORMAT*]] |
|
| 11 | 11 |
|
| 12 | 12 |
# DESCRIPTION |
| 13 | 13 |
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 |
| 15 | 15 |
The number of images shown is the number of unique images. The same image tagged |
| 16 | 16 |
under different names is counted only once. |
| 17 | 17 |
|
| 18 |
+If a format is specified, the given template will be executed instead of the |
|
| 19 |
+default format. Go's **text/template** package |
|
| 20 |
+describes all the details of the format. |
|
| 21 |
+ |
|
| 18 | 22 |
Depending on the storage driver in use, additional information can be shown, such |
| 19 | 23 |
as pool name, data file, metadata file, data space used, total data space, metadata |
| 20 | 24 |
space used, and total metadata space. |
| ... | ... |
@@ -28,6 +32,9 @@ available on the volume where `/var/lib/docker` is mounted. |
| 28 | 28 |
**--help** |
| 29 | 29 |
Print usage statement |
| 30 | 30 |
|
| 31 |
+**-f**, **--format**="" |
|
| 32 |
+ Format the output using the given go template |
|
| 33 |
+ |
|
| 31 | 34 |
# EXAMPLES |
| 32 | 35 |
|
| 33 | 36 |
## Display Docker system information |
| ... | ... |
@@ -140,6 +147,11 @@ information about the devicemapper storage driver is shown: |
| 140 | 140 |
myinsecurehost:5000 |
| 141 | 141 |
127.0.0.0/8 |
| 142 | 142 |
|
| 143 |
+You can also specify the output format: |
|
| 144 |
+ |
|
| 145 |
+ $ docker info --format '{{json .}}'
|
|
| 146 |
+ {"ID":"I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S","Containers":14, ...}
|
|
| 147 |
+ |
|
| 143 | 148 |
# HISTORY |
| 144 | 149 |
April 2014, Originally compiled by William Henry (whenry at redhat dot com) |
| 145 | 150 |
based on docker.com source material and internal work. |