package server import ( "context" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" "github.com/docker/docker/api/types/filters" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) var allFilter bool var allFilterFlag = &cli.BoolFlag{ Name: "all, a", Usage: "Remove all unused images not just dangling ones", Destination: &allFilter, } var volunesFilter bool var volumesFilterFlag = &cli.BoolFlag{ Name: "volumes, v", Usage: "Prune volumes. This will remove app data, Be Careful!", Destination: &volunesFilter, } var serverPruneCommand = cli.Command{ Name: "prune", Aliases: []string{"p"}, Usage: "Prune a managed server; Runs a docker system prune", Description: ` Prunes unused containers, networks, and dangling images. If passing "-v/--volumes" then volumes not connected with a deployed app will also be removed. This can result in unwanted data loss if not used carefully. `, ArgsUsage: "[]", Flags: []cli.Flag{ allFilterFlag, volumesFilterFlag, internal.DebugFlag, }, Before: internal.SubCommandBefore, BashComplete: autocomplete.ServerNameComplete, Action: func(c *cli.Context) error { var args filters.Args serverName := internal.ValidateServer(c) cl, err := client.New(serverName) if err != nil { logrus.Fatal(err) } ctx := context.Background() cr, err := cl.ContainersPrune(ctx, args) if err != nil { logrus.Fatal(err) } logrus.Infof("containers deleted: %s; space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) nr, err := cl.NetworksPrune(ctx, args) if err != nil { logrus.Fatal(err) } logrus.Infof("networks deleted %s", nr.NetworksDeleted) pruneFilters := filters.NewArgs() if allFilter { pruneFilters.Add("dangling", "false") } ir, err := cl.ImagesPrune(ctx, pruneFilters) if err != nil { logrus.Fatal(err) } logrus.Infof("images deleted: %s; space reclaimed: %v", ir.ImagesDeleted, ir.SpaceReclaimed) if volunesFilter { vr, err := cl.VolumesPrune(ctx, args) if err != nil { logrus.Fatal(err) } logrus.Infof("volumes deleted: %s; space reclaimed: %v", vr.VolumesDeleted, vr.SpaceReclaimed) } return nil }, }