containerd/cmd/ctr/list.go
Stephen J Day 5d13f8027c
cmd/{dist, ctr}: cleanup flushing and alignment
Signed-off-by: Stephen J Day <stephen.day@docker.com>
2017-06-16 14:49:48 -07:00

92 lines
1.6 KiB
Go

package main
import (
"fmt"
"os"
"text/tabwriter"
"github.com/containerd/containerd"
"github.com/urfave/cli"
)
var containersCommand = cli.Command{
Name: "containers",
}
var listCommand = cli.Command{
Name: "list",
Aliases: []string{"ls"},
Usage: "list containers",
Flags: []cli.Flag{
cli.BoolFlag{
Name: "quiet, q",
Usage: "print only the container id",
},
},
Action: func(context *cli.Context) error {
var (
quiet = context.Bool("quiet")
ctx, cancel = appContext(context)
)
defer cancel()
client, err := newClient(context)
if err != nil {
return err
}
containers, err := client.Containers(ctx)
if err != nil {
return err
}
if quiet {
for _, c := range containers {
fmt.Println(c.ID())
}
return nil
}
w := tabwriter.NewWriter(os.Stdout, 10, 1, 3, ' ', 0)
fmt.Fprintln(w, "ID\tIMAGE\tPID\tSTATUS")
for _, c := range containers {
var imageName string
if image, err := c.Image(ctx); err != nil {
if err != containerd.ErrNoImage {
return err
}
imageName = "-"
} else {
imageName = image.Name()
}
var (
status string
pid uint32
)
task, err := c.Task(ctx, nil)
if err == nil {
s, err := task.Status(ctx)
if err != nil {
return err
}
status = string(s)
pid = task.Pid()
} else {
if err != containerd.ErrNoRunningTask {
return err
}
status = string(containerd.Stopped)
pid = 0
}
if _, err := fmt.Fprintf(w, "%s\t%s\t%d\t%s\n",
c.ID(),
imageName,
pid,
status,
); err != nil {
return err
}
}
return w.Flush()
},
}