github.com/Benchkram/bob@v0.0.0-20220321080157-7c8f3876e225/cli/cmd_compose.go (about) 1 //go:build dev 2 // +build dev 3 4 package cli 5 6 import ( 7 "context" 8 "fmt" 9 "os" 10 "os/signal" 11 "syscall" 12 13 "github.com/Benchkram/bob/pkg/composectl" 14 "github.com/Benchkram/bob/pkg/composeutil" 15 "github.com/Benchkram/errz" 16 "github.com/spf13/cobra" 17 ) 18 19 func init() { 20 rootCmd.AddCommand(composeCmd) 21 } 22 23 var composeCmd = &cobra.Command{ 24 Use: "compose", 25 Short: "Manage docker-compose environment", 26 Args: cobra.MinimumNArgs(1), 27 Long: ``, 28 Run: func(cmd *cobra.Command, args []string) { 29 defer errz.Recover() 30 31 switch args[0] { // guaranteed by minimumArgs == 1 32 case "up": 33 path := "docker-compose.yml" 34 p, err := composeutil.ProjectFromConfig(path) 35 if err != nil { 36 errz.Fatal(err) 37 } 38 39 cfgs := composeutil.ProjectPortConfigs(p) 40 41 portConflicts := "" 42 portMapping := "" 43 if composeutil.HasPortConflicts(cfgs) { 44 conflicts := composeutil.PortConflicts(cfgs) 45 46 portConflicts = conflicts.String() 47 48 fmt.Println("Conflicting ports detected:") 49 fmt.Println(portConflicts) 50 51 // TODO: disable once we also resolve binaries' ports 52 errz.Fatal(fmt.Errorf(fmt.Sprint("conflicting ports detected:\n", conflicts))) 53 54 resolved, err := composeutil.ResolvePortConflicts(conflicts) 55 errz.Fatal(err) 56 57 portMapping = resolved.String() 58 59 fmt.Println("Resolved port mapping:") 60 fmt.Println(portMapping) 61 62 // update project's ports 63 composeutil.ApplyPortMapping(p, resolved) 64 } 65 66 ctx, cancel := context.WithCancel(context.Background()) 67 defer cancel() 68 69 ctl, err := composectl.New(p, portConflicts, portMapping) 70 if err != nil { 71 errz.Fatal(err) 72 } 73 74 fmt.Println() 75 err = ctl.Up(ctx) 76 if err != nil { 77 errz.Fatal(err) 78 } 79 80 defer func() { 81 fmt.Print("\n\n") 82 err := ctl.Down(context.Background()) 83 if err != nil { 84 errz.Log(err) 85 } 86 fmt.Println("\nEnvironment down.") 87 }() 88 89 fmt.Print("\nEnvironment up.") 90 91 stop := make(chan os.Signal, 1) 92 signal.Notify(stop, os.Interrupt, syscall.SIGTERM) 93 94 <-stop 95 } 96 }, 97 ValidArgs: []string{"up"}, 98 }