diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index 72d8effc7..ea076c2ef 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -278,12 +278,7 @@ const PluginName = "compose" // RunningAsStandalone detects when running as a standalone program func RunningAsStandalone() bool { - println("check running as standalone") - standalone := len(os.Args) < 2 || os.Args[1] != manager.MetadataSubcommandName && os.Args[1] != PluginName - fmt.Fprintf(os.Stderr, "%v+\n", os.Args) - println("len os.args", len(os.Args)) - println("STANDALONE:", standalone) - return standalone + return len(os.Args) < 2 || os.Args[1] != manager.MetadataSubcommandName && os.Args[1] != PluginName } // RootCommand returns the compose command with its child commands diff --git a/pkg/compose/up.go b/pkg/compose/up.go index fb54a5965..8236adff0 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -31,7 +31,7 @@ import ( "github.com/hashicorp/go-multierror" ) -func (s *composeService) Up(ctx context.Context, project *types.Project, options api.UpOptions) error { +func (s *composeService) Up(ctx context.Context, project *types.Project, options api.UpOptions) error { //nolint:gocyclo err := progress.Run(ctx, tracing.SpanWrapFunc("project/up", tracing.ProjectOptions(project), func(ctx context.Context) error { err := s.create(ctx, project, options.Create) if err != nil { @@ -69,24 +69,31 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options doneCh := make(chan bool) eg.Go(func() error { first := true + gracefulTeardown := func() { + printer.Cancel() + fmt.Fprintln(s.stdinfo(), "Gracefully stopping... (press Ctrl+C again to force)") + eg.Go(func() error { + err := s.Stop(context.Background(), project.Name, api.StopOptions{ + Services: options.Create.Services, + Project: project, + }) + isTerminated = true + close(doneCh) + return err + }) + first = false + } for { select { case <-doneCh: return nil + case <-ctx.Done(): + if first { + gracefulTeardown() + } case <-signalChan: if first { - printer.Cancel() - fmt.Fprintln(s.stdinfo(), "Gracefully stopping... (press Ctrl+C again to force)") - eg.Go(func() error { - err := s.Stop(context.Background(), project.Name, api.StopOptions{ - Services: options.Create.Services, - Project: project, - }) - isTerminated = true - close(doneCh) - return err - }) - first = false + gracefulTeardown() } else { eg.Go(func() error { return s.Kill(context.Background(), project.Name, api.KillOptions{