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
} |