|
|
@@ -20,6 +20,7 @@ import (
|
|
|
"context"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "github.com/sirupsen/logrus"
|
|
|
"os"
|
|
|
"path/filepath"
|
|
|
|
|
|
@@ -152,14 +153,15 @@ func runCreateStart(ctx context.Context, opts upOptions, services []string) erro
|
|
|
|
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
|
listener := make(chan compose.ContainerExited)
|
|
|
+ exitCode := make(chan int)
|
|
|
go func() {
|
|
|
var aborting bool
|
|
|
for {
|
|
|
- <-listener
|
|
|
+ exit := <-listener
|
|
|
if opts.cascadeStop && !aborting {
|
|
|
aborting = true
|
|
|
- fmt.Println("Aborting on container exit...")
|
|
|
cancel()
|
|
|
+ exitCode <- exit.Status
|
|
|
}
|
|
|
}
|
|
|
}()
|
|
|
@@ -170,15 +172,29 @@ func runCreateStart(ctx context.Context, opts upOptions, services []string) erro
|
|
|
})
|
|
|
|
|
|
if errors.Is(ctx.Err(), context.Canceled) {
|
|
|
- fmt.Println("Gracefully stopping...")
|
|
|
- ctx = context.Background()
|
|
|
- _, err = progress.Run(ctx, func(ctx context.Context) (string, error) {
|
|
|
- return "", c.ComposeService().Stop(ctx, project)
|
|
|
- })
|
|
|
+ select {
|
|
|
+ case exit := <-exitCode:
|
|
|
+ fmt.Println("Aborting on container exit...")
|
|
|
+ err = stop(c, project)
|
|
|
+ logrus.Error(exit)
|
|
|
+ // os.Exit(exit)
|
|
|
+ default:
|
|
|
+ // cancelled by user
|
|
|
+ fmt.Println("Gracefully stopping...")
|
|
|
+ err = stop(c, project)
|
|
|
+ }
|
|
|
}
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+func stop(c *client.Client, project *types.Project) error {
|
|
|
+ ctx := context.Background()
|
|
|
+ _, err := progress.Run(ctx, func(ctx context.Context) (string, error) {
|
|
|
+ return "", c.ComposeService().Stop(ctx, project)
|
|
|
+ })
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
func setup(ctx context.Context, opts composeOptions, services []string) (*client.Client, *types.Project, error) {
|
|
|
c, err := client.NewWithDefaultLocalBackend(ctx)
|
|
|
if err != nil {
|