Selaa lähdekoodia

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>
Sebastiaan van Stijn 9 vuotta sitten
vanhempi
commit
7c46ba02e6

+ 6 - 1
daemon/list.go

@@ -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 {

+ 1 - 1
docs/reference/api/docker_remote_api.md

@@ -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")

+ 1 - 1
docs/reference/api/docker_remote_api_v1.24.md

@@ -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:
 
 

+ 25 - 7
docs/reference/commandline/ps.md

@@ -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
-    $docker run -d --net=net2 --name=test2 ubuntu top
+The following filter matches all containers that are connected to a network
+with a name containing `net1`.
 
 
-    $docker ps --filter network=net1
-    CONTAINER ID        IMAGE       COMMAND       CREATED             STATUS              PORTS               NAMES
-    9d4893ed80fe        ubuntu      "top"         10 minutes ago      Up 10 minutes                           test1
+```bash
+$ docker run -d --net=net1 --name=test1 ubuntu top
+$ 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
 
 

+ 31 - 8
integration-cli/docker_cli_ps_test.go

@@ -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
-	out, _ := runSleepingContainer(c, "--net=bridge", "--name=onbridgenetwork")
-	out, _ = runSleepingContainer(c, "--net=none", "--name=onnonenetwork")
+	// TODO default network on Windows is not called "bridge", and creating a
+	// custom network fails on Windows fails with "Error response from daemon: plugin not found")
+	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(lines[1], checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on bridge network\n"))
+	c.Assert(containerOut, checker.Contains, "onnonenetwork", check.Commentf("Missing the container on none 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")
 }
 }

+ 1 - 1
man/docker-ps.1.md

@@ -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.