// +build linux package main import ( "fmt" "io/ioutil" "os" "path/filepath" "text/tabwriter" "time" "github.com/Sirupsen/logrus" "github.com/codegangsta/cli" "github.com/opencontainers/runc/libcontainer" ) var listCommand = cli.Command{ Name: "list", Usage: "lists containers started by runc with the given root", Action: func(context *cli.Context) { factory, err := loadFactory(context) if err != nil { logrus.Fatal(err) } // get the list of containers root := context.GlobalString("root") absRoot, err := filepath.Abs(root) if err != nil { logrus.Fatal(err) } list, err := ioutil.ReadDir(absRoot) if err != nil { logrus.Fatal(err) } w := tabwriter.NewWriter(os.Stdout, 12, 1, 3, ' ', 0) fmt.Fprint(w, "ID\tPID\tSTATUS\tCREATED\n") // output containers for _, item := range list { if item.IsDir() { if err := outputListInfo(item.Name(), factory, w); err != nil { logrus.Fatal(err) } } } if err := w.Flush(); err != nil { logrus.Fatal(err) } }, } func outputListInfo(id string, factory libcontainer.Factory, w *tabwriter.Writer) error { container, err := factory.Load(id) if err != nil { return err } containerStatus, err := container.Status() if err != nil { return err } state, err := container.State() if err != nil { return err } fmt.Fprintf(w, "%s\t%d\t%s\t%s\n", container.ID(), state.BaseState.InitProcessPid, containerStatus.String(), state.BaseState.Created.Format(time.RFC3339Nano)) return nil }