// String returns a human-readable description of the state func (s *State) String() string { s.RLock() defer s.RUnlock() if s.Running { if s.Ghost { return fmt.Sprintf("Ghost") } return fmt.Sprintf("Up %s", utils.HumanDuration(time.Now().UTC().Sub(s.StartedAt))) } return fmt.Sprintf("Exited (%d) %s ago", s.ExitCode, utils.HumanDuration(time.Now().UTC().Sub(s.FinishedAt))) }
func (cli *DockerCli) CmdHistory(args ...string) error { cmd := Subcmd("history", "IMAGE", "Show the history of an image") if err := cmd.Parse(args); err != nil { return nil } if cmd.NArg() != 1 { cmd.Usage() return nil } body, _, err := cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil) if err != nil { return err } var outs []ApiHistory err = json.Unmarshal(body, &outs) if err != nil { return err } w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) fmt.Fprintln(w, "ID\tCREATED\tCREATED BY") for _, out := range outs { fmt.Fprintf(w, "%s\t%s ago\t%s\n", out.Id, utils.HumanDuration(time.Now().Sub(time.Unix(out.Created, 0))), out.CreatedBy) } w.Flush() return nil }
// String returns a human-readable description of the state func (s *State) String() string { if s.Running { if s.Ghost { return fmt.Sprintf("Ghost") } return fmt.Sprintf("Up %s", utils.HumanDuration(time.Now().Sub(s.StartedAt))) } return fmt.Sprintf("Exit %d", s.ExitCode) }
func (cli *DockerCli) CmdPs(args ...string) error { cmd := Subcmd("ps", "[OPTIONS]", "List containers") quiet := cmd.Bool("q", false, "Only display numeric IDs") all := cmd.Bool("a", false, "Show all containers. Only running containers are shown by default.") noTrunc := cmd.Bool("notrunc", false, "Don't truncate output") nLatest := cmd.Bool("l", false, "Show only the latest created container, include non-running ones.") since := cmd.String("sinceId", "", "Show only containers created since Id, include non-running ones.") before := cmd.String("beforeId", "", "Show only container created before Id, include non-running ones.") last := cmd.Int("n", -1, "Show n last created containers, include non-running ones.") if err := cmd.Parse(args); err != nil { return nil } v := url.Values{} if *last == -1 && *nLatest { *last = 1 } if *all { v.Set("all", "1") } if *last != -1 { v.Set("limit", strconv.Itoa(*last)) } if *since != "" { v.Set("since", *since) } if *before != "" { v.Set("before", *before) } body, _, err := cli.call("GET", "/containers/json?"+v.Encode(), nil) if err != nil { return err } var outs []ApiContainers err = json.Unmarshal(body, &outs) if err != nil { return err } w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) if !*quiet { fmt.Fprintln(w, "ID\tIMAGE\tCOMMAND\tCREATED\tSTATUS\tPORTS") } for _, out := range outs { if !*quiet { if *noTrunc { fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\t%s\n", out.Id, out.Image, out.Command, utils.HumanDuration(time.Now().Sub(time.Unix(out.Created, 0))), out.Status, out.Ports) } else { fmt.Fprintf(w, "%s\t%s\t%s\t%s ago\t%s\t%s\n", utils.TruncateId(out.Id), out.Image, utils.Trunc(out.Command, 20), utils.HumanDuration(time.Now().Sub(time.Unix(out.Created, 0))), out.Status, out.Ports) } } else { if *noTrunc { fmt.Fprintln(w, out.Id) } else { fmt.Fprintln(w, utils.TruncateId(out.Id)) } } } if !*quiet { w.Flush() } return nil }
func (cli *DockerCli) CmdImages(args ...string) error { cmd := Subcmd("images", "[OPTIONS] [NAME]", "List images") quiet := cmd.Bool("q", false, "only show numeric IDs") all := cmd.Bool("a", false, "show all images") noTrunc := cmd.Bool("notrunc", false, "Don't truncate output") flViz := cmd.Bool("viz", false, "output graph in graphviz format") if err := cmd.Parse(args); err != nil { return nil } if cmd.NArg() > 1 { cmd.Usage() return nil } if *flViz { body, _, err := cli.call("GET", "/images/viz", false) if err != nil { return err } fmt.Printf("%s", body) } else { v := url.Values{} if cmd.NArg() == 1 { v.Set("filter", cmd.Arg(0)) } if *all { v.Set("all", "1") } body, _, err := cli.call("GET", "/images/json?"+v.Encode(), nil) if err != nil { return err } var outs []ApiImages err = json.Unmarshal(body, &outs) if err != nil { return err } w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0) if !*quiet { fmt.Fprintln(w, "REPOSITORY\tTAG\tID\tCREATED") } for _, out := range outs { if out.Repository == "" { out.Repository = "<none>" } if out.Tag == "" { out.Tag = "<none>" } if !*quiet { fmt.Fprintf(w, "%s\t%s\t", out.Repository, out.Tag) if *noTrunc { fmt.Fprintf(w, "%s\t", out.Id) } else { fmt.Fprintf(w, "%s\t", utils.TruncateId(out.Id)) } fmt.Fprintf(w, "%s ago\n", utils.HumanDuration(time.Now().Sub(time.Unix(out.Created, 0)))) } else { if *noTrunc { fmt.Fprintln(w, out.Id) } else { fmt.Fprintln(w, utils.TruncateId(out.Id)) } } } if !*quiet { w.Flush() } } return nil }