github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/stop/stop.go (about) 1 package stop 2 3 import ( 4 "context" 5 _ "embed" 6 "fmt" 7 "os" 8 9 "github.com/Redstoneguy129/cli/internal/utils" 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/filters" 12 "github.com/spf13/afero" 13 ) 14 15 func Run(ctx context.Context, backup bool, fsys afero.Fs) error { 16 // Sanity checks. 17 if err := utils.LoadConfigFS(fsys); err != nil { 18 return err 19 } 20 21 // Stop all services 22 if err := stop(ctx, backup); err != nil { 23 return err 24 } 25 26 fmt.Println("Stopped " + utils.Aqua("supabase") + " local development setup.") 27 return nil 28 } 29 30 func stop(ctx context.Context, backup bool) error { 31 args := filters.NewArgs( 32 filters.Arg("label", "com.supabase.cli.project="+utils.Config.ProjectId), 33 ) 34 containers, err := utils.Docker.ContainerList(ctx, types.ContainerListOptions{ 35 All: true, 36 Filters: args, 37 }) 38 if err != nil { 39 return err 40 } 41 // Gracefully shutdown containers 42 var ids []string 43 for _, c := range containers { 44 if c.State == "running" { 45 ids = append(ids, c.ID) 46 } 47 } 48 utils.WaitAll(ids, utils.DockerStop) 49 if _, err := utils.Docker.ContainersPrune(ctx, args); err != nil { 50 return err 51 } 52 // Remove named volumes 53 if backup { 54 fmt.Fprintln(os.Stderr, "Postgres database saved to volume:", utils.DbId) 55 fmt.Fprintln(os.Stderr, "Storage directory saved to volume:", utils.StorageId) 56 } else { 57 // TODO: label named volumes to use VolumesPrune for branch support 58 volumes := []string{utils.DbId, utils.StorageId} 59 utils.WaitAll(volumes, func(name string) { 60 if err := utils.Docker.VolumeRemove(ctx, name, true); err != nil { 61 fmt.Fprintln(os.Stderr, "failed to remove volume:", name, err) 62 } 63 }) 64 } 65 // Remove networks. 66 _, err = utils.Docker.NetworksPrune(ctx, args) 67 return err 68 }