mirror of
https://github.com/moby/moby.git
synced 2025-07-30 18:23:29 +03:00
Add label
filter for docker system prune
This fix tries to address the issue raised in 29999 where it was not possible to mask these items (like important non-removable stuff) from `docker system prune`. This fix adds `label` and `label!` field for `--filter` in `system prune`, so that it is possible to selectively prune items like: ``` $ docker container prune --filter label=foo $ docker container prune --filter label!=bar ``` Additional unit tests and integration tests have been added. This fix fixes 29999. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
This commit is contained in:
@ -3,6 +3,9 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@ -111,3 +114,177 @@ func (s *DockerSuite) TestPruneContainerUntil(c *check.C) {
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestPruneContainerLabel(c *check.C) {
|
||||
out, _ := dockerCmd(c, "run", "-d", "--label", "foo", "busybox")
|
||||
id1 := strings.TrimSpace(out)
|
||||
c.Assert(waitExited(id1, 5*time.Second), checker.IsNil)
|
||||
|
||||
out, _ = dockerCmd(c, "run", "-d", "--label", "bar", "busybox")
|
||||
id2 := strings.TrimSpace(out)
|
||||
c.Assert(waitExited(id2, 5*time.Second), checker.IsNil)
|
||||
|
||||
out, _ = dockerCmd(c, "run", "-d", "busybox")
|
||||
id3 := strings.TrimSpace(out)
|
||||
c.Assert(waitExited(id3, 5*time.Second), checker.IsNil)
|
||||
|
||||
out, _ = dockerCmd(c, "run", "-d", "--label", "foobar", "busybox")
|
||||
id4 := strings.TrimSpace(out)
|
||||
c.Assert(waitExited(id4, 5*time.Second), checker.IsNil)
|
||||
|
||||
// Add a config file of label=foobar, that will have no impact if cli is label!=foobar
|
||||
config := `{"pruneFilters": ["label=foobar"]}`
|
||||
d, err := ioutil.TempDir("", "integration-cli-")
|
||||
c.Assert(err, checker.IsNil)
|
||||
defer os.RemoveAll(d)
|
||||
err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644)
|
||||
c.Assert(err, checker.IsNil)
|
||||
|
||||
// With config.json only, prune based on label=foobar
|
||||
out, _ = dockerCmd(c, "--config", d, "container", "prune", "--force")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id4)
|
||||
|
||||
out, _ = dockerCmd(c, "container", "prune", "--force", "--filter", "label=foo")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3)
|
||||
|
||||
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id3)
|
||||
|
||||
out, _ = dockerCmd(c, "container", "prune", "--force", "--filter", "label!=bar")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id3)
|
||||
|
||||
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3)
|
||||
|
||||
// With config.json label=foobar and CLI label!=foobar, CLI label!=foobar supersede
|
||||
out, _ = dockerCmd(c, "--config", d, "container", "prune", "--force", "--filter", "label!=foobar")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
|
||||
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestPruneVolumeLabel(c *check.C) {
|
||||
out, _ := dockerCmd(c, "volume", "create", "--label", "foo")
|
||||
id1 := strings.TrimSpace(out)
|
||||
c.Assert(id1, checker.Not(checker.Equals), "")
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "create", "--label", "bar")
|
||||
id2 := strings.TrimSpace(out)
|
||||
c.Assert(id2, checker.Not(checker.Equals), "")
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "create")
|
||||
id3 := strings.TrimSpace(out)
|
||||
c.Assert(id3, checker.Not(checker.Equals), "")
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "create", "--label", "foobar")
|
||||
id4 := strings.TrimSpace(out)
|
||||
c.Assert(id4, checker.Not(checker.Equals), "")
|
||||
|
||||
// Add a config file of label=foobar, that will have no impact if cli is label!=foobar
|
||||
config := `{"pruneFilters": ["label=foobar"]}`
|
||||
d, err := ioutil.TempDir("", "integration-cli-")
|
||||
c.Assert(err, checker.IsNil)
|
||||
defer os.RemoveAll(d)
|
||||
err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644)
|
||||
c.Assert(err, checker.IsNil)
|
||||
|
||||
// With config.json only, prune based on label=foobar
|
||||
out, _ = dockerCmd(c, "--config", d, "volume", "prune", "--force")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id4)
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "prune", "--force", "--filter", "label=foo")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3)
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "ls", "--format", "{{.Name}}")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id3)
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "prune", "--force", "--filter", "label!=bar")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id3)
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "ls", "--format", "{{.Name}}")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3)
|
||||
|
||||
// With config.json label=foobar and CLI label!=foobar, CLI label!=foobar supersede
|
||||
out, _ = dockerCmd(c, "--config", d, "volume", "prune", "--force", "--filter", "label!=foobar")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
|
||||
out, _ = dockerCmd(c, "volume", "ls", "--format", "{{.Name}}")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestPruneNetworkLabel(c *check.C) {
|
||||
dockerCmd(c, "network", "create", "--label", "foo", "n1")
|
||||
dockerCmd(c, "network", "create", "--label", "bar", "n2")
|
||||
dockerCmd(c, "network", "create", "n3")
|
||||
|
||||
out, _ := dockerCmd(c, "network", "prune", "--force", "--filter", "label=foo")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, "n1")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n2")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n3")
|
||||
|
||||
out, _ = dockerCmd(c, "network", "prune", "--force", "--filter", "label!=bar")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n1")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n2")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, "n3")
|
||||
|
||||
out, _ = dockerCmd(c, "network", "prune", "--force")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n1")
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, "n2")
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n3")
|
||||
}
|
||||
|
||||
func (s *DockerDaemonSuite) TestPruneImageLabel(c *check.C) {
|
||||
s.d.StartWithBusybox(c)
|
||||
|
||||
out, _, err := s.d.BuildImageWithOut("test1",
|
||||
`FROM busybox
|
||||
LABEL foo=bar`, true, "-q")
|
||||
c.Assert(err, checker.IsNil)
|
||||
id1 := strings.TrimSpace(out)
|
||||
out, err = s.d.Cmd("images", "-q", "--no-trunc")
|
||||
c.Assert(err, checker.IsNil)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id1)
|
||||
|
||||
out, _, err = s.d.BuildImageWithOut("test2",
|
||||
`FROM busybox
|
||||
LABEL bar=foo`, true, "-q")
|
||||
c.Assert(err, checker.IsNil)
|
||||
id2 := strings.TrimSpace(out)
|
||||
out, err = s.d.Cmd("images", "-q", "--no-trunc")
|
||||
c.Assert(err, checker.IsNil)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
|
||||
out, err = s.d.Cmd("image", "prune", "--force", "--all", "--filter", "label=foo=bar")
|
||||
c.Assert(err, checker.IsNil)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
|
||||
out, err = s.d.Cmd("image", "prune", "--force", "--all", "--filter", "label!=bar=foo")
|
||||
c.Assert(err, checker.IsNil)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2)
|
||||
|
||||
out, err = s.d.Cmd("image", "prune", "--force", "--all", "--filter", "label=bar=foo")
|
||||
c.Assert(err, checker.IsNil)
|
||||
c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1)
|
||||
c.Assert(strings.TrimSpace(out), checker.Contains, id2)
|
||||
}
|
||||
|
Reference in New Issue
Block a user