Parcourir la source

Added additional container information to "docker info".

Instead of just showing the number of containers this patch will
show the number of running, paused and stopped containers as well.

Signed-off-by: Kim Eik <kim@heldig.org>
(cherry picked from commit a9804ab1cb117a132cbf460067d55f5146d50956)
Kim Eik il y a 9 ans
Parent
commit
e732f4e649

+ 3 - 0
api/client/info.go

@@ -25,6 +25,9 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
 	}
 	}
 
 
 	fmt.Fprintf(cli.out, "Containers: %d\n", info.Containers)
 	fmt.Fprintf(cli.out, "Containers: %d\n", info.Containers)
+	fmt.Fprintf(cli.out, " Running: %d\n", info.ContainersRunning)
+	fmt.Fprintf(cli.out, " Paused: %d\n", info.ContainersPaused)
+	fmt.Fprintf(cli.out, " Stopped: %d\n", info.ContainersStopped)
 	fmt.Fprintf(cli.out, "Images: %d\n", info.Images)
 	fmt.Fprintf(cli.out, "Images: %d\n", info.Images)
 	ioutils.FprintfIfNotEmpty(cli.out, "Server Version: %s\n", info.ServerVersion)
 	ioutils.FprintfIfNotEmpty(cli.out, "Server Version: %s\n", info.ServerVersion)
 	ioutils.FprintfIfNotEmpty(cli.out, "Storage Driver: %s\n", info.Driver)
 	ioutils.FprintfIfNotEmpty(cli.out, "Storage Driver: %s\n", info.Driver)

+ 15 - 0
daemon/info.go

@@ -54,9 +54,24 @@ func (daemon *Daemon) SystemInfo() (*types.Info, error) {
 	initPath := utils.DockerInitPath("")
 	initPath := utils.DockerInitPath("")
 	sysInfo := sysinfo.New(true)
 	sysInfo := sysinfo.New(true)
 
 
+	var cRunning, cPaused, cStopped int
+	for _, c := range daemon.List() {
+		switch c.StateString() {
+		case "paused":
+			cPaused++
+		case "running":
+			cRunning++
+		default:
+			cStopped++
+		}
+	}
+
 	v := &types.Info{
 	v := &types.Info{
 		ID:                 daemon.ID,
 		ID:                 daemon.ID,
 		Containers:         len(daemon.List()),
 		Containers:         len(daemon.List()),
+		ContainersRunning:  cRunning,
+		ContainersPaused:   cPaused,
+		ContainersStopped:  cStopped,
 		Images:             len(daemon.imageStore.Map()),
 		Images:             len(daemon.imageStore.Map()),
 		Driver:             daemon.GraphDriverName(),
 		Driver:             daemon.GraphDriverName(),
 		DriverStatus:       daemon.layerStore.DriverStatus(),
 		DriverStatus:       daemon.layerStore.DriverStatus(),

+ 3 - 0
docs/reference/commandline/info.md

@@ -21,6 +21,9 @@ For example:
 
 
     $ docker -D info
     $ docker -D info
     Containers: 14
     Containers: 14
+     Running: 3
+     Paused: 1
+     Stopped: 10
     Images: 52
     Images: 52
     Server Version: 1.9.0
     Server Version: 1.9.0
     Storage Driver: aufs
     Storage Driver: aufs

+ 3 - 0
docs/userguide/labels-custom-metadata.md

@@ -192,6 +192,9 @@ These labels appear as part of the `docker info` output for the daemon:
 
 
     $ docker -D info
     $ docker -D info
     Containers: 12
     Containers: 12
+     Running: 5
+     Paused: 2
+     Stopped: 5
     Images: 672
     Images: 672
     Server Version: 1.9.0
     Server Version: 1.9.0
     Storage Driver: aufs
     Storage Driver: aufs

+ 1 - 0
integration-cli/check_test.go

@@ -28,6 +28,7 @@ type DockerSuite struct {
 }
 }
 
 
 func (s *DockerSuite) TearDownTest(c *check.C) {
 func (s *DockerSuite) TearDownTest(c *check.C) {
+	unpauseAllContainers()
 	deleteAllContainers()
 	deleteAllContainers()
 	deleteAllImages()
 	deleteAllImages()
 	deleteAllVolumes()
 	deleteAllVolumes()

+ 3 - 0
integration-cli/docker_api_info_test.go

@@ -18,6 +18,9 @@ func (s *DockerSuite) TestInfoApi(c *check.C) {
 	stringsToCheck := []string{
 	stringsToCheck := []string{
 		"ID",
 		"ID",
 		"Containers",
 		"Containers",
+		"ContainersRunning",
+		"ContainersPaused",
+		"ContainersStopped",
 		"Images",
 		"Images",
 		"ExecutionDriver",
 		"ExecutionDriver",
 		"LoggingDriver",
 		"LoggingDriver",

+ 45 - 0
integration-cli/docker_cli_info_test.go

@@ -3,6 +3,7 @@ package main
 import (
 import (
 	"fmt"
 	"fmt"
 	"net"
 	"net"
+	"strings"
 
 
 	"github.com/docker/docker/pkg/integration/checker"
 	"github.com/docker/docker/pkg/integration/checker"
 	"github.com/docker/docker/utils"
 	"github.com/docker/docker/utils"
@@ -17,6 +18,9 @@ func (s *DockerSuite) TestInfoEnsureSucceeds(c *check.C) {
 	stringsToCheck := []string{
 	stringsToCheck := []string{
 		"ID:",
 		"ID:",
 		"Containers:",
 		"Containers:",
+		" Running:",
+		" Paused:",
+		" Stopped:",
 		"Images:",
 		"Images:",
 		"Execution Driver:",
 		"Execution Driver:",
 		"OSType:",
 		"OSType:",
@@ -101,3 +105,44 @@ func (s *DockerSuite) TestInfoDiscoveryAdvertiseInterfaceName(c *check.C) {
 	c.Assert(out, checker.Contains, fmt.Sprintf("Cluster store: %s\n", discoveryBackend))
 	c.Assert(out, checker.Contains, fmt.Sprintf("Cluster store: %s\n", discoveryBackend))
 	c.Assert(out, checker.Contains, fmt.Sprintf("Cluster advertise: %s:2375\n", ip.String()))
 	c.Assert(out, checker.Contains, fmt.Sprintf("Cluster advertise: %s:2375\n", ip.String()))
 }
 }
+
+func (s *DockerSuite) TestInfoDisplaysRunningContainers(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+
+	dockerCmd(c, "run", "-d", "busybox", "top")
+	out, _ := dockerCmd(c, "info")
+	c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 1))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 0))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 0))
+}
+
+func (s *DockerSuite) TestInfoDisplaysPausedContainers(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+
+	out, _ := dockerCmd(c, "run", "-d", "busybox", "top")
+	cleanedContainerID := strings.TrimSpace(out)
+
+	dockerCmd(c, "pause", cleanedContainerID)
+
+	out, _ = dockerCmd(c, "info")
+	c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 0))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 1))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 0))
+}
+
+func (s *DockerSuite) TestInfoDisplaysStoppedContainers(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+
+	out, _ := dockerCmd(c, "run", "-d", "busybox", "top")
+	cleanedContainerID := strings.TrimSpace(out)
+
+	dockerCmd(c, "stop", cleanedContainerID)
+
+	out, _ = dockerCmd(c, "info")
+	c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 0))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 0))
+	c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 1))
+}

+ 3 - 0
man/docker-info.1.md

@@ -32,6 +32,9 @@ Here is a sample output:
 
 
     # docker info
     # docker info
     Containers: 14
     Containers: 14
+     Running: 3
+     Paused: 1
+     Stopped: 10
     Images: 52
     Images: 52
     Server Version: 1.9.0
     Server Version: 1.9.0
     Storage Driver: aufs
     Storage Driver: aufs

+ 3 - 0
vendor/src/github.com/docker/engine-api/types/types.go

@@ -192,6 +192,9 @@ type Version struct {
 type Info struct {
 type Info struct {
 	ID                 string
 	ID                 string
 	Containers         int
 	Containers         int
+	ContainersRunning  int
+	ContainersPaused   int
+	ContainersStopped  int
 	Images             int
 	Images             int
 	Driver             string
 	Driver             string
 	DriverStatus       [][2]string
 	DriverStatus       [][2]string