summaryrefslogtreecommitdiff
path: root/cmd/podman/system_prune.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/system_prune.go')
-rw-r--r--cmd/podman/system_prune.go107
1 files changed, 107 insertions, 0 deletions
diff --git a/cmd/podman/system_prune.go b/cmd/podman/system_prune.go
new file mode 100644
index 000000000..145fb4c94
--- /dev/null
+++ b/cmd/podman/system_prune.go
@@ -0,0 +1,107 @@
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "strings"
+
+ "github.com/containers/libpod/cmd/podman/shared"
+ "github.com/containers/libpod/libpod/adapter"
+ "github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
+ "github.com/urfave/cli"
+)
+
+var (
+ pruneSystemDescription = `
+ podman system prune
+
+ Remove unused data
+`
+ pruneSystemFlags = []cli.Flag{
+ cli.BoolFlag{
+ Name: "all, a",
+ Usage: "remove all unused data",
+ },
+ cli.BoolFlag{
+ Name: "force, f",
+ Usage: "Do not prompt for confirmation",
+ },
+ cli.BoolFlag{
+ Name: "volumes",
+ Usage: "Prune volumes",
+ },
+ }
+ pruneSystemCommand = cli.Command{
+ Name: "prune",
+ Usage: "Remove unused data",
+ Description: pruneSystemDescription,
+ Action: pruneSystemCmd,
+ OnUsageError: usageErrorHandler,
+ Flags: pruneSystemFlags,
+ }
+)
+
+func pruneSystemCmd(c *cli.Context) error {
+
+ // Prompt for confirmation if --force is not set
+ if !c.Bool("force") {
+ reader := bufio.NewReader(os.Stdin)
+ volumeString := ""
+ if c.Bool("volumes") {
+ volumeString = `
+ - all volumes not used by at least one container`
+ }
+ fmt.Printf(`
+WARNING! This will remove:
+ - all stopped containers%s
+ - all dangling images
+ - all build cache
+Are you sure you want to continue? [y/N] `, volumeString)
+ ans, err := reader.ReadString('\n')
+ if err != nil {
+ return errors.Wrapf(err, "error reading input")
+ }
+ if strings.ToLower(ans)[0] != 'y' {
+ return nil
+ }
+ }
+
+ runtime, err := adapter.GetRuntime(c)
+ if err != nil {
+ return errors.Wrapf(err, "could not get runtime")
+ }
+ defer runtime.Shutdown(false)
+
+ ctx := getContext()
+ fmt.Println("Deleted Containers")
+ lasterr := pruneContainers(runtime, ctx, shared.Parallelize("rm"), false)
+ if c.Bool("volumes") {
+ fmt.Println("Deleted Volumes")
+ err := volumePrune(runtime, getContext())
+ if err != nil {
+ if lasterr != nil {
+ logrus.Errorf("%q", lasterr)
+ }
+ lasterr = err
+ }
+ }
+
+ // Call prune; if any cids are returned, print them and then
+ // return err in case an error also came up
+ pruneCids, err := runtime.PruneImages(c.Bool("all"))
+ if len(pruneCids) > 0 {
+ fmt.Println("Deleted Images")
+ for _, cid := range pruneCids {
+ fmt.Println(cid)
+ }
+ }
+ if err != nil {
+ if lasterr != nil {
+ logrus.Errorf("%q", lasterr)
+ }
+ lasterr = err
+ }
+ return lasterr
+}