github.com/portworx/docker@v1.12.1/api/client/info.go (about) 1 package client 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 8 "golang.org/x/net/context" 9 10 Cli "github.com/docker/docker/cli" 11 "github.com/docker/docker/pkg/ioutils" 12 flag "github.com/docker/docker/pkg/mflag" 13 "github.com/docker/docker/utils" 14 "github.com/docker/engine-api/types/swarm" 15 "github.com/docker/go-units" 16 ) 17 18 // CmdInfo displays system-wide information. 19 // 20 // Usage: docker info 21 func (cli *DockerCli) CmdInfo(args ...string) error { 22 cmd := Cli.Subcmd("info", nil, Cli.DockerCommands["info"].Description, true) 23 cmd.Require(flag.Exact, 0) 24 25 cmd.ParseFlags(args, true) 26 27 ctx := context.Background() 28 info, err := cli.client.Info(ctx) 29 if err != nil { 30 return err 31 } 32 33 fmt.Fprintf(cli.out, "Containers: %d\n", info.Containers) 34 fmt.Fprintf(cli.out, " Running: %d\n", info.ContainersRunning) 35 fmt.Fprintf(cli.out, " Paused: %d\n", info.ContainersPaused) 36 fmt.Fprintf(cli.out, " Stopped: %d\n", info.ContainersStopped) 37 fmt.Fprintf(cli.out, "Images: %d\n", info.Images) 38 ioutils.FprintfIfNotEmpty(cli.out, "Server Version: %s\n", info.ServerVersion) 39 ioutils.FprintfIfNotEmpty(cli.out, "Storage Driver: %s\n", info.Driver) 40 if info.DriverStatus != nil { 41 for _, pair := range info.DriverStatus { 42 fmt.Fprintf(cli.out, " %s: %s\n", pair[0], pair[1]) 43 44 // print a warning if devicemapper is using a loopback file 45 if pair[0] == "Data loop file" { 46 fmt.Fprintln(cli.err, " WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.") 47 } 48 } 49 50 } 51 if info.SystemStatus != nil { 52 for _, pair := range info.SystemStatus { 53 fmt.Fprintf(cli.out, "%s: %s\n", pair[0], pair[1]) 54 } 55 } 56 ioutils.FprintfIfNotEmpty(cli.out, "Logging Driver: %s\n", info.LoggingDriver) 57 ioutils.FprintfIfNotEmpty(cli.out, "Cgroup Driver: %s\n", info.CgroupDriver) 58 59 fmt.Fprintf(cli.out, "Plugins:\n") 60 fmt.Fprintf(cli.out, " Volume:") 61 fmt.Fprintf(cli.out, " %s", strings.Join(info.Plugins.Volume, " ")) 62 fmt.Fprintf(cli.out, "\n") 63 fmt.Fprintf(cli.out, " Network:") 64 fmt.Fprintf(cli.out, " %s", strings.Join(info.Plugins.Network, " ")) 65 fmt.Fprintf(cli.out, "\n") 66 67 if len(info.Plugins.Authorization) != 0 { 68 fmt.Fprintf(cli.out, " Authorization:") 69 fmt.Fprintf(cli.out, " %s", strings.Join(info.Plugins.Authorization, " ")) 70 fmt.Fprintf(cli.out, "\n") 71 } 72 73 fmt.Fprintf(cli.out, "Swarm: %v\n", info.Swarm.LocalNodeState) 74 if info.Swarm.LocalNodeState != swarm.LocalNodeStateInactive { 75 fmt.Fprintf(cli.out, " NodeID: %s\n", info.Swarm.NodeID) 76 if info.Swarm.Error != "" { 77 fmt.Fprintf(cli.out, " Error: %v\n", info.Swarm.Error) 78 } 79 fmt.Fprintf(cli.out, " Is Manager: %v\n", info.Swarm.ControlAvailable) 80 if info.Swarm.ControlAvailable { 81 fmt.Fprintf(cli.out, " ClusterID: %s\n", info.Swarm.Cluster.ID) 82 fmt.Fprintf(cli.out, " Managers: %d\n", info.Swarm.Managers) 83 fmt.Fprintf(cli.out, " Nodes: %d\n", info.Swarm.Nodes) 84 fmt.Fprintf(cli.out, " Orchestration:\n") 85 fmt.Fprintf(cli.out, " Task History Retention Limit: %d\n", info.Swarm.Cluster.Spec.Orchestration.TaskHistoryRetentionLimit) 86 fmt.Fprintf(cli.out, " Raft:\n") 87 fmt.Fprintf(cli.out, " Snapshot Interval: %d\n", info.Swarm.Cluster.Spec.Raft.SnapshotInterval) 88 fmt.Fprintf(cli.out, " Heartbeat Tick: %d\n", info.Swarm.Cluster.Spec.Raft.HeartbeatTick) 89 fmt.Fprintf(cli.out, " Election Tick: %d\n", info.Swarm.Cluster.Spec.Raft.ElectionTick) 90 fmt.Fprintf(cli.out, " Dispatcher:\n") 91 fmt.Fprintf(cli.out, " Heartbeat Period: %s\n", units.HumanDuration(time.Duration(info.Swarm.Cluster.Spec.Dispatcher.HeartbeatPeriod))) 92 fmt.Fprintf(cli.out, " CA Configuration:\n") 93 fmt.Fprintf(cli.out, " Expiry Duration: %s\n", units.HumanDuration(info.Swarm.Cluster.Spec.CAConfig.NodeCertExpiry)) 94 if len(info.Swarm.Cluster.Spec.CAConfig.ExternalCAs) > 0 { 95 fmt.Fprintf(cli.out, " External CAs:\n") 96 for _, entry := range info.Swarm.Cluster.Spec.CAConfig.ExternalCAs { 97 fmt.Fprintf(cli.out, " %s: %s\n", entry.Protocol, entry.URL) 98 } 99 } 100 } 101 fmt.Fprintf(cli.out, " Node Address: %s\n", info.Swarm.NodeAddr) 102 } 103 104 if len(info.Runtimes) > 0 { 105 fmt.Fprintf(cli.out, "Runtimes:") 106 for name := range info.Runtimes { 107 fmt.Fprintf(cli.out, " %s", name) 108 } 109 fmt.Fprint(cli.out, "\n") 110 fmt.Fprintf(cli.out, "Default Runtime: %s\n", info.DefaultRuntime) 111 } 112 113 fmt.Fprintf(cli.out, "Security Options:") 114 ioutils.FprintfIfNotEmpty(cli.out, " %s", strings.Join(info.SecurityOptions, " ")) 115 fmt.Fprintf(cli.out, "\n") 116 117 ioutils.FprintfIfNotEmpty(cli.out, "Kernel Version: %s\n", info.KernelVersion) 118 ioutils.FprintfIfNotEmpty(cli.out, "Operating System: %s\n", info.OperatingSystem) 119 ioutils.FprintfIfNotEmpty(cli.out, "OSType: %s\n", info.OSType) 120 ioutils.FprintfIfNotEmpty(cli.out, "Architecture: %s\n", info.Architecture) 121 fmt.Fprintf(cli.out, "CPUs: %d\n", info.NCPU) 122 fmt.Fprintf(cli.out, "Total Memory: %s\n", units.BytesSize(float64(info.MemTotal))) 123 ioutils.FprintfIfNotEmpty(cli.out, "Name: %s\n", info.Name) 124 ioutils.FprintfIfNotEmpty(cli.out, "ID: %s\n", info.ID) 125 fmt.Fprintf(cli.out, "Docker Root Dir: %s\n", info.DockerRootDir) 126 fmt.Fprintf(cli.out, "Debug Mode (client): %v\n", utils.IsDebugEnabled()) 127 fmt.Fprintf(cli.out, "Debug Mode (server): %v\n", info.Debug) 128 129 if info.Debug { 130 fmt.Fprintf(cli.out, " File Descriptors: %d\n", info.NFd) 131 fmt.Fprintf(cli.out, " Goroutines: %d\n", info.NGoroutines) 132 fmt.Fprintf(cli.out, " System Time: %s\n", info.SystemTime) 133 fmt.Fprintf(cli.out, " EventsListeners: %d\n", info.NEventsListener) 134 } 135 136 ioutils.FprintfIfNotEmpty(cli.out, "Http Proxy: %s\n", info.HTTPProxy) 137 ioutils.FprintfIfNotEmpty(cli.out, "Https Proxy: %s\n", info.HTTPSProxy) 138 ioutils.FprintfIfNotEmpty(cli.out, "No Proxy: %s\n", info.NoProxy) 139 140 if info.IndexServerAddress != "" { 141 u := cli.configFile.AuthConfigs[info.IndexServerAddress].Username 142 if len(u) > 0 { 143 fmt.Fprintf(cli.out, "Username: %v\n", u) 144 } 145 fmt.Fprintf(cli.out, "Registry: %v\n", info.IndexServerAddress) 146 } 147 148 // Only output these warnings if the server does not support these features 149 if info.OSType != "windows" { 150 if !info.MemoryLimit { 151 fmt.Fprintln(cli.err, "WARNING: No memory limit support") 152 } 153 if !info.SwapLimit { 154 fmt.Fprintln(cli.err, "WARNING: No swap limit support") 155 } 156 if !info.KernelMemory { 157 fmt.Fprintln(cli.err, "WARNING: No kernel memory limit support") 158 } 159 if !info.OomKillDisable { 160 fmt.Fprintln(cli.err, "WARNING: No oom kill disable support") 161 } 162 if !info.CPUCfsQuota { 163 fmt.Fprintln(cli.err, "WARNING: No cpu cfs quota support") 164 } 165 if !info.CPUCfsPeriod { 166 fmt.Fprintln(cli.err, "WARNING: No cpu cfs period support") 167 } 168 if !info.CPUShares { 169 fmt.Fprintln(cli.err, "WARNING: No cpu shares support") 170 } 171 if !info.CPUSet { 172 fmt.Fprintln(cli.err, "WARNING: No cpuset support") 173 } 174 if !info.IPv4Forwarding { 175 fmt.Fprintln(cli.err, "WARNING: IPv4 forwarding is disabled") 176 } 177 if !info.BridgeNfIptables { 178 fmt.Fprintln(cli.err, "WARNING: bridge-nf-call-iptables is disabled") 179 } 180 if !info.BridgeNfIP6tables { 181 fmt.Fprintln(cli.err, "WARNING: bridge-nf-call-ip6tables is disabled") 182 } 183 } 184 185 if info.Labels != nil { 186 fmt.Fprintln(cli.out, "Labels:") 187 for _, attribute := range info.Labels { 188 fmt.Fprintf(cli.out, " %s\n", attribute) 189 } 190 } 191 192 ioutils.FprintfIfTrue(cli.out, "Experimental: %v\n", info.ExperimentalBuild) 193 if info.ClusterStore != "" { 194 fmt.Fprintf(cli.out, "Cluster Store: %s\n", info.ClusterStore) 195 } 196 197 if info.ClusterAdvertise != "" { 198 fmt.Fprintf(cli.out, "Cluster Advertise: %s\n", info.ClusterAdvertise) 199 } 200 201 if info.RegistryConfig != nil && (len(info.RegistryConfig.InsecureRegistryCIDRs) > 0 || len(info.RegistryConfig.IndexConfigs) > 0) { 202 fmt.Fprintln(cli.out, "Insecure Registries:") 203 for _, registry := range info.RegistryConfig.IndexConfigs { 204 if registry.Secure == false { 205 fmt.Fprintf(cli.out, " %s\n", registry.Name) 206 } 207 } 208 209 for _, registry := range info.RegistryConfig.InsecureRegistryCIDRs { 210 mask, _ := registry.Mask.Size() 211 fmt.Fprintf(cli.out, " %s/%d\n", registry.IP.String(), mask) 212 } 213 } 214 return nil 215 }