diff --git a/cli/app/undeploy.go b/cli/app/undeploy.go index 3abf5304..e5861994 100644 --- a/cli/app/undeploy.go +++ b/cli/app/undeploy.go @@ -24,52 +24,53 @@ var pruneFlag = &cli.BoolFlag{ Usage: "Prunes unused containers, networks, and dangling images for an app", } -// pruneSystem runs the equivalent of a "docker system prune" after undeploying -// in order to clean up left over state related to the deployment. We must run -// this logic inside a loop as it may take some time for the undeployed to come -// down. +// pruneSystem runs the equivalent of a "docker system prune" after an undeploy +// in order to clean up left over state related to the deployment. Volumes are +// not pruned to avoid unwated data loss. func pruneSystem(c *cli.Context, cl *dockerClient.Client, app config.App) error { + stackName := app.StackName() + ctx := context.Background() + for { - if !prune { - return nil - } + logrus.Debugf("polling for %s stack, waiting to be undeployed...", stackName) - stackName := app.StackName() - - ctx := context.Background() - pruneFilters := filters.NewArgs() - stackSearch := fmt.Sprintf("%s*", stackName) - pruneFilters.Add("label", stackSearch) - cr, err := cl.ContainersPrune(ctx, pruneFilters) + services, err := stack.GetStackServices(ctx, cl, stackName) if err != nil { - logrus.Errorf(err.Error()) - time.Sleep(time.Second) - continue + return err } - logrus.Infof("containers deleted: %s; space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) - - nr, err := cl.NetworksPrune(ctx, pruneFilters) - if err != nil { - logrus.Errorf(err.Error()) - time.Sleep(time.Second) - continue + if len(services) == 0 { + logrus.Debugf("%s undeployed, moving on with pruning logic", stackName) + break } - logrus.Infof("networks deleted %s", nr.NetworksDeleted) - - ir, err := cl.ImagesPrune(ctx, pruneFilters) - if err != nil { - logrus.Errorf(err.Error()) - time.Sleep(time.Second) - continue - } - - logrus.Infof("images deleted: %s; space reclaimed: %v", ir.ImagesDeleted, ir.SpaceReclaimed) - - break + time.Sleep(time.Second) } + pruneFilters := filters.NewArgs() + stackSearch := fmt.Sprintf("%s*", stackName) + pruneFilters.Add("label", stackSearch) + cr, err := cl.ContainersPrune(ctx, pruneFilters) + if err != nil { + return err + } + + logrus.Infof("containers deleted: %s; space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) + + nr, err := cl.NetworksPrune(ctx, pruneFilters) + if err != nil { + return err + } + + logrus.Infof("networks deleted %s", nr.NetworksDeleted) + + ir, err := cl.ImagesPrune(ctx, pruneFilters) + if err != nil { + return err + } + + logrus.Infof("images deleted: %s; space reclaimed: %v", ir.ImagesDeleted, ir.SpaceReclaimed) + return nil } @@ -118,8 +119,10 @@ volumes as eligible for pruning once undeployed. logrus.Fatal(err) } - if err := pruneSystem(c, cl, app); err != nil { - logrus.Fatal(err) + if prune { + if err := pruneSystem(c, cl, app); err != nil { + logrus.Fatal(err) + } } return nil