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