|
@@ -3,11 +3,13 @@ package daemon
|
|
import (
|
|
import (
|
|
"errors"
|
|
"errors"
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "strconv"
|
|
"strings"
|
|
"strings"
|
|
|
|
|
|
"github.com/docker/docker/pkg/graphdb"
|
|
"github.com/docker/docker/pkg/graphdb"
|
|
|
|
|
|
"github.com/docker/docker/engine"
|
|
"github.com/docker/docker/engine"
|
|
|
|
+ "github.com/docker/docker/pkg/parsers/filters"
|
|
)
|
|
)
|
|
|
|
|
|
// List returns an array of all containers registered in the daemon.
|
|
// List returns an array of all containers registered in the daemon.
|
|
@@ -24,9 +26,25 @@ func (daemon *Daemon) Containers(job *engine.Job) engine.Status {
|
|
before = job.Getenv("before")
|
|
before = job.Getenv("before")
|
|
n = job.GetenvInt("limit")
|
|
n = job.GetenvInt("limit")
|
|
size = job.GetenvBool("size")
|
|
size = job.GetenvBool("size")
|
|
|
|
+ psFilters filters.Args
|
|
|
|
+ filt_exited []int
|
|
)
|
|
)
|
|
outs := engine.NewTable("Created", 0)
|
|
outs := engine.NewTable("Created", 0)
|
|
|
|
|
|
|
|
+ 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)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
names := map[string][]string{}
|
|
names := map[string][]string{}
|
|
daemon.ContainerGraph().Walk("/", func(p string, e *graphdb.Entity) error {
|
|
daemon.ContainerGraph().Walk("/", func(p string, e *graphdb.Entity) error {
|
|
names[e.ID()] = append(names[e.ID()], p)
|
|
names[e.ID()] = append(names[e.ID()], p)
|
|
@@ -69,6 +87,18 @@ func (daemon *Daemon) Containers(job *engine.Job) engine.Status {
|
|
return errLast
|
|
return errLast
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ if len(filt_exited) > 0 && !container.State.IsRunning() {
|
|
|
|
+ should_skip := true
|
|
|
|
+ for _, code := range filt_exited {
|
|
|
|
+ if code == container.State.GetExitCode() {
|
|
|
|
+ should_skip = false
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if should_skip {
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+ }
|
|
displayed++
|
|
displayed++
|
|
out := &engine.Env{}
|
|
out := &engine.Env{}
|
|
out.Set("Id", container.ID)
|
|
out.Set("Id", container.ID)
|