// trapSignals traps both SIGINT and SIGTERM and defers to cli.Exit // to do a graceful exit. func trapSignals() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { s := <-c cli.Exit(128 + int(s.(syscall.Signal))) }() }
func Run(sous *core.Sous, args []string) { targetName := "app" if len(args) != 0 { targetName = args[0] } core.RequireGit() core.RequireDocker() target, context := sous.AssembleTargetContext(targetName) runner, ok := target.(core.ContainerTarget) if !ok { cli.Fatalf("Target %s does not support running.", target.Name()) } rebuilt, _ := sous.RunTarget(target, context) dr, _ := sous.RunContainerTarget(runner, context, rebuilt) if exitCode := dr.ExitCode(); exitCode != 0 { cli.Logf("Docker container exited with code %d", exitCode) cli.Exit(exitCode) } cli.Success() }