add support for filtering by network ID

This adds support for filtering by network ID, to be
consistent with other filter options.

Note that only *full* matches are returned; this is
consistent with other filters (e.g. volume), that
also return full matches only.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2016-06-06 02:04:33 +02:00
parent 912af1ae8f
commit 7c46ba02e6
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
6 changed files with 65 additions and 19 deletions

View File

@ -378,9 +378,14 @@ func includeContainerInList(container *container.Container, ctx *listContext) it
networkExist := fmt.Errorf("container part of network") networkExist := fmt.Errorf("container part of network")
if ctx.filters.Include("network") { if ctx.filters.Include("network") {
err := ctx.filters.WalkValues("network", func(value string) error { err := ctx.filters.WalkValues("network", func(value string) error {
if network := container.NetworkSettings.Networks[value]; network != nil { if _, ok := container.NetworkSettings.Networks[value]; ok {
return networkExist return networkExist
} }
for _, nw := range container.NetworkSettings.Networks {
if nw.NetworkID == value {
return networkExist
}
}
return nil return nil
}) })
if err != networkExist { if err != networkExist {

View File

@ -117,7 +117,7 @@ This section lists each version from latest to oldest. Each listing includes a
* `POST /containers/create` now takes `StorageOpt` field. * `POST /containers/create` now takes `StorageOpt` field.
* `GET /info` now returns `SecurityOptions` field, showing if `apparmor`, `seccomp`, or `selinux` is supported. * `GET /info` now returns `SecurityOptions` field, showing if `apparmor`, `seccomp`, or `selinux` is supported.
* `GET /networks` now supports filtering by `label` and `driver`. * `GET /networks` now supports filtering by `label` and `driver`.
* `GET /containers/json` now supports filtering containers by `network` name. * `GET /containers/json` now supports filtering containers by `network` name or id.
* `POST /containers/create` now takes `MaximumIOps` and `MaximumIOBps` fields. Windows daemon only. * `POST /containers/create` now takes `MaximumIOps` and `MaximumIOBps` fields. Windows daemon only.
* `POST /containers/create` now returns an HTTP 400 "bad parameter" message * `POST /containers/create` now returns an HTTP 400 "bad parameter" message
if no command is specified (instead of an HTTP 500 "server error") if no command is specified (instead of an HTTP 500 "server error")

View File

@ -223,7 +223,7 @@ Query Parameters:
- `before`=(`<container id>` or `<container name>`) - `before`=(`<container id>` or `<container name>`)
- `since`=(`<container id>` or `<container name>`) - `since`=(`<container id>` or `<container name>`)
- `volume`=(`<volume name>` or `<mount point destination>`) - `volume`=(`<volume name>` or `<mount point destination>`)
- `network`=(`<network name>`) - `network`=(`<network id>` or `<network name>`)
Status Codes: Status Codes:

View File

@ -62,7 +62,7 @@ The currently supported filters are:
* since (container's id or name) - filters containers created since given id or name * since (container's id or name) - filters containers created since given id or name
* isolation (default|process|hyperv) (Windows daemon only) * isolation (default|process|hyperv) (Windows daemon only)
* volume (volume name or mount point) - filters containers that mount volumes. * volume (volume name or mount point) - filters containers that mount volumes.
* network (network name) - filters containers connected to the provided network name * network (network id or name) - filters containers connected to the provided network
#### Label #### Label
@ -209,15 +209,33 @@ The `volume` filter shows only containers that mount a specific volume or have a
#### Network #### Network
The `network` filter shows only containers that has endpoints on the provided network name. The `network` filter shows only containers that are connected to a network with
a given name or id.
$docker run -d --net=net1 --name=test1 ubuntu top The following filter matches all containers that are connected to a network
$docker run -d --net=net2 --name=test2 ubuntu top with a name containing `net1`.
$docker ps --filter network=net1 ```bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ docker run -d --net=net1 --name=test1 ubuntu top
9d4893ed80fe ubuntu "top" 10 minutes ago Up 10 minutes test1 $ docker run -d --net=net2 --name=test2 ubuntu top
$ docker ps --filter network=net1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d4893ed80fe ubuntu "top" 10 minutes ago Up 10 minutes test1
```
The network filter matches on both the network's name and id. The following
example shows all containers that are attached to the `net1` network, using
the network id as a filter;
```bash
$ docker network inspect --format "{{.ID}}" net1
8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5
$ docker ps --filter network=8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d4893ed80fe ubuntu "top" 10 minutes ago Up 10 minutes test1
```
## Formatting ## Formatting

View File

@ -806,15 +806,30 @@ func (s *DockerSuite) TestPsFormatSize(c *check.C) {
} }
func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) { func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) {
// create a container // TODO default network on Windows is not called "bridge", and creating a
out, _ := runSleepingContainer(c, "--net=bridge", "--name=onbridgenetwork") // custom network fails on Windows fails with "Error response from daemon: plugin not found")
out, _ = runSleepingContainer(c, "--net=none", "--name=onnonenetwork") testRequires(c, DaemonIsLinux)
// create some containers
runSleepingContainer(c, "--net=bridge", "--name=onbridgenetwork")
runSleepingContainer(c, "--net=none", "--name=onnonenetwork")
// Filter docker ps on non existing network
out, _ := dockerCmd(c, "ps", "--filter", "network=doesnotexist")
containerOut := strings.TrimSpace(string(out))
lines := strings.Split(containerOut, "\n")
// skip header
lines = lines[1:]
// ps output should have no containers
c.Assert(lines, checker.HasLen, 0)
// Filter docker ps on network bridge // Filter docker ps on network bridge
out, _ = dockerCmd(c, "ps", "--filter", "network=bridge") out, _ = dockerCmd(c, "ps", "--filter", "network=bridge")
containerOut := strings.TrimSpace(string(out)) containerOut = strings.TrimSpace(string(out))
lines := strings.Split(containerOut, "\n") lines = strings.Split(containerOut, "\n")
// skip header // skip header
lines = lines[1:] lines = lines[1:]
@ -823,7 +838,7 @@ func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) {
c.Assert(lines, checker.HasLen, 1) c.Assert(lines, checker.HasLen, 1)
// Making sure onbridgenetwork is on the output // Making sure onbridgenetwork is on the output
c.Assert(lines[0], checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on network\n")) c.Assert(containerOut, checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on network\n"))
// Filter docker ps on networks bridge and none // Filter docker ps on networks bridge and none
out, _ = dockerCmd(c, "ps", "--filter", "network=bridge", "--filter", "network=none") out, _ = dockerCmd(c, "ps", "--filter", "network=bridge", "--filter", "network=none")
@ -838,6 +853,14 @@ func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) {
c.Assert(lines, checker.HasLen, 2) c.Assert(lines, checker.HasLen, 2)
// Making sure onbridgenetwork and onnonenetwork is on the output // Making sure onbridgenetwork and onnonenetwork is on the output
c.Assert(lines[0], checker.Contains, "onnonenetwork", check.Commentf("Missing the container on none network\n")) c.Assert(containerOut, checker.Contains, "onnonenetwork", check.Commentf("Missing the container on none network\n"))
c.Assert(lines[1], checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on bridge network\n")) c.Assert(containerOut, checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on bridge network\n"))
nwID, _ := dockerCmd(c, "network", "inspect", "--format", "{{.ID}}", "bridge")
// Filter by network ID
out, _ = dockerCmd(c, "ps", "--filter", "network="+nwID)
containerOut = strings.TrimSpace(string(out))
c.Assert(containerOut, checker.Contains, "onbridgenetwork")
} }

View File

@ -36,7 +36,7 @@ the running containers.
- since=(<container-name>|<container-id>) - since=(<container-name>|<container-id>)
- ancestor=(<image-name>[:tag]|<image-id>|<image@digest>) - containers created from an image or a descendant. - ancestor=(<image-name>[:tag]|<image-id>|<image@digest>) - containers created from an image or a descendant.
- volume=(<volume-name>|<mount-point-destination>) - volume=(<volume-name>|<mount-point-destination>)
- network=(<network-name>) - containers connected to the provided network name - network=(<network-name>|<network-id>) - containers connected to the provided network
**--format**="*TEMPLATE*" **--format**="*TEMPLATE*"
Pretty-print containers using a Go template. Pretty-print containers using a Go template.