ps.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package cmd
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "text/tabwriter"
  7. "github.com/pkg/errors"
  8. "github.com/spf13/cobra"
  9. "github.com/docker/api/cli/formatter"
  10. "github.com/docker/api/client"
  11. formatter2 "github.com/docker/api/formatter"
  12. )
  13. type psOpts struct {
  14. all bool
  15. quiet bool
  16. json bool
  17. }
  18. func (o psOpts) validate() error {
  19. if o.quiet && o.json {
  20. return errors.New(`cannot combine "quiet" and "json" options`)
  21. }
  22. return nil
  23. }
  24. // PsCommand lists containers
  25. func PsCommand() *cobra.Command {
  26. var opts psOpts
  27. cmd := &cobra.Command{
  28. Use: "ps",
  29. Short: "List containers",
  30. RunE: func(cmd *cobra.Command, args []string) error {
  31. return runPs(cmd.Context(), opts)
  32. },
  33. }
  34. cmd.Flags().BoolVarP(&opts.quiet, "quiet", "q", false, "Only display IDs")
  35. cmd.Flags().BoolVarP(&opts.all, "all", "a", false, "Show all containers (default shows just running)")
  36. cmd.Flags().BoolVar(&opts.json, "json", false, "Format output as JSON")
  37. return cmd
  38. }
  39. func runPs(ctx context.Context, opts psOpts) error {
  40. err := opts.validate()
  41. if err != nil {
  42. return err
  43. }
  44. c, err := client.New(ctx)
  45. if err != nil {
  46. return errors.Wrap(err, "cannot connect to backend")
  47. }
  48. containers, err := c.ContainerService().List(ctx, opts.all)
  49. if err != nil {
  50. return errors.Wrap(err, "fetch containers")
  51. }
  52. if opts.quiet {
  53. for _, c := range containers {
  54. fmt.Println(c.ID)
  55. }
  56. return nil
  57. }
  58. if opts.json {
  59. j, err := formatter2.ToStandardJSON(containers)
  60. if err != nil {
  61. return err
  62. }
  63. fmt.Println(j)
  64. return nil
  65. }
  66. w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0)
  67. fmt.Fprintf(w, "CONTAINER ID\tIMAGE\tCOMMAND\tSTATUS\tPORTS\n")
  68. format := "%s\t%s\t%s\t%s\t%s\n"
  69. for _, c := range containers {
  70. fmt.Fprintf(w, format, c.ID, c.Image, c.Command, c.Status, formatter.PortsString(c.Ports))
  71. }
  72. return w.Flush()
  73. }