daemon/list.go
d0370076
 package daemon
74fdadc8
 
 import (
 	"errors"
 	"fmt"
84146719
 	"strconv"
74fdadc8
 	"strings"
 
e45deceb
 	"github.com/docker/docker/graph"
74fdadc8
 	"github.com/docker/docker/pkg/graphdb"
a2b0c977
 	"github.com/docker/docker/utils"
d0370076
 
 	"github.com/docker/docker/engine"
e45deceb
 	"github.com/docker/docker/pkg/parsers"
84146719
 	"github.com/docker/docker/pkg/parsers/filters"
74fdadc8
 )
 
d0370076
 // List returns an array of all containers registered in the daemon.
 func (daemon *Daemon) List() []*Container {
 	return daemon.containers.List()
 }
 
 func (daemon *Daemon) Containers(job *engine.Job) engine.Status {
74fdadc8
 	var (
 		foundBefore bool
 		displayed   int
 		all         = job.GetenvBool("all")
 		since       = job.Getenv("since")
 		before      = job.Getenv("before")
 		n           = job.GetenvInt("limit")
 		size        = job.GetenvBool("size")
84146719
 		psFilters   filters.Args
 		filt_exited []int
74fdadc8
 	)
 	outs := engine.NewTable("Created", 0)
 
84146719
 	psFilters, err := filters.FromParam(job.Getenv("filters"))
 	if err != nil {
 		return job.Error(err)
 	}
 	if i, ok := psFilters["exited"]; ok {
 		for _, value := range i {
 			code, err := strconv.Atoi(value)
 			if err != nil {
 				return job.Error(err)
 			}
 			filt_exited = append(filt_exited, code)
 		}
 	}
 
2639e073
 	if i, ok := psFilters["status"]; ok {
 		for _, value := range i {
 			if value == "exited" {
 				all = true
 			}
 		}
 	}
74fdadc8
 	names := map[string][]string{}
d0370076
 	daemon.ContainerGraph().Walk("/", func(p string, e *graphdb.Entity) error {
74fdadc8
 		names[e.ID()] = append(names[e.ID()], p)
 		return nil
10c3d9f8
 	}, 1)
74fdadc8
 
d0370076
 	var beforeCont, sinceCont *Container
74fdadc8
 	if before != "" {
d25a6537
 		beforeCont, err = daemon.Get(before)
 		if err != nil {
 			return job.Error(err)
74fdadc8
 		}
 	}
 
 	if since != "" {
d25a6537
 		sinceCont, err = daemon.Get(since)
 		if err != nil {
 			return job.Error(err)
74fdadc8
 		}
 	}
 
 	errLast := errors.New("last container")
d0370076
 	writeCont := func(container *Container) error {
74fdadc8
 		container.Lock()
 		defer container.Unlock()
e0339d4b
 		if !container.Running && !all && n <= 0 && since == "" && before == "" {
74fdadc8
 			return nil
 		}
16346253
 		if !psFilters.Match("name", container.Name) {
 			return nil
 		}
 
 		if !psFilters.Match("id", container.ID) {
 			return nil
 		}
 
abb5e9a0
 		if !psFilters.MatchKVList("label", container.Config.Labels) {
 			return nil
 		}
 
74fdadc8
 		if before != "" && !foundBefore {
 			if container.ID == beforeCont.ID {
 				foundBefore = true
 			}
 			return nil
 		}
 		if n > 0 && displayed == n {
 			return errLast
 		}
 		if since != "" {
 			if container.ID == sinceCont.ID {
 				return errLast
 			}
 		}
81f84023
 		if len(filt_exited) > 0 {
84146719
 			should_skip := true
 			for _, code := range filt_exited {
81f84023
 				if code == container.ExitCode && !container.Running {
84146719
 					should_skip = false
 					break
 				}
 			}
 			if should_skip {
 				return nil
 			}
 		}
16346253
 
 		if !psFilters.Match("status", container.State.StateString()) {
 			return nil
ea09f036
 		}
74fdadc8
 		displayed++
 		out := &engine.Env{}
d942c59b
 		out.SetJson("Id", container.ID)
74fdadc8
 		out.SetList("Names", names[container.ID])
e45deceb
 		img := container.Config.Image
 		_, tag := parsers.ParseRepositoryTag(container.Config.Image)
 		if tag == "" {
a2b0c977
 			img = utils.ImageReference(img, graph.DEFAULTTAG)
e45deceb
 		}
 		out.SetJson("Image", img)
74fdadc8
 		if len(container.Args) > 0 {
 			args := []string{}
 			for _, arg := range container.Args {
 				if strings.Contains(arg, " ") {
 					args = append(args, fmt.Sprintf("'%s'", arg))
 				} else {
 					args = append(args, arg)
 				}
 			}
 			argsAsString := strings.Join(args, " ")
 
 			out.Set("Command", fmt.Sprintf("\"%s %s\"", container.Path, argsAsString))
 		} else {
 			out.Set("Command", fmt.Sprintf("\"%s\"", container.Path))
 		}
 		out.SetInt64("Created", container.Created.Unix())
 		out.Set("Status", container.State.String())
 		str, err := container.NetworkSettings.PortMappingAPI().ToListString()
 		if err != nil {
 			return err
 		}
 		out.Set("Ports", str)
 		if size {
 			sizeRw, sizeRootFs := container.GetSize()
 			out.SetInt64("SizeRw", sizeRw)
 			out.SetInt64("SizeRootFs", sizeRootFs)
 		}
abb5e9a0
 		out.SetJson("Labels", container.Config.Labels)
74fdadc8
 		outs.Add(out)
 		return nil
 	}
 
d0370076
 	for _, container := range daemon.List() {
74fdadc8
 		if err := writeCont(container); err != nil {
 			if err != errLast {
 				return job.Error(err)
 			}
 			break
 		}
 	}
 	outs.ReverseSort()
 	if _, err := outs.WriteListTo(job.Stdout); err != nil {
 		return job.Error(err)
 	}
 	return engine.StatusOK
 }