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