diff --git a/pkg/compose/printer.go b/pkg/compose/printer.go index e54c8c8bf..45b0f7914 100644 --- a/pkg/compose/printer.go +++ b/pkg/compose/printer.go @@ -86,7 +86,8 @@ func (p *printer) Run(cascadeStop bool, exitCodeFrom string, stopFn func() error ) defer p.Stop() - containers := map[string]struct{}{} + // containers we are tracking. Use true when container is running, false after we receive a stop|die signal + containers := map[string]bool{} for { select { case <-p.stopCh: @@ -100,18 +101,20 @@ func (p *printer) Run(cascadeStop bool, exitCodeFrom string, stopFn func() error if _, ok := containers[id]; ok { continue } - containers[id] = struct{}{} + containers[id] = true p.consumer.Register(container) case api.ContainerEventExit, api.ContainerEventStopped, api.ContainerEventRecreated: - if !event.Restarting { - delete(containers, id) - } - if !aborting { + if !aborting && containers[id] { p.consumer.Status(container, fmt.Sprintf("exited with code %d", event.ExitCode)) if event.Type == api.ContainerEventRecreated { p.consumer.Status(container, "has been recreated") } } + containers[id] = false + if !event.Restarting { + delete(containers, id) + } + if cascadeStop { if !aborting { aborting = true diff --git a/pkg/compose/up.go b/pkg/compose/up.go index b91a4ef73..ab22de48b 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -127,8 +127,10 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options if options.Start.Watch { eg.Go(func() error { + buildOpts := *options.Create.Build + buildOpts.Quiet = true return s.Watch(ctx, project, options.Start.Services, api.WatchOptions{ - Build: options.Create.Build, + Build: &buildOpts, LogTo: options.Start.Attach, }) }) diff --git a/pkg/compose/watch.go b/pkg/compose/watch.go index dca4d7c15..2a651baac 100644 --- a/pkg/compose/watch.go +++ b/pkg/compose/watch.go @@ -445,7 +445,6 @@ func (s *composeService) handleWatchBatch(ctx context.Context, project *types.Pr options.LogTo.Log(api.WatchLogger, fmt.Sprintf("Rebuilding service %q after changes were detected...", serviceName)) // restrict the build to ONLY this service, not any of its dependencies options.Build.Services = []string{serviceName} - options.Build.Quiet = true _, err := s.build(ctx, project, *options.Build, nil) if err != nil { options.LogTo.Log(api.WatchLogger, fmt.Sprintf("Build failed. Error: %v", err))