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  }