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", 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", 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 }, }