stop as all registered containers exited || cascadestop

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
Nicolas De Loof 2021-02-12 11:37:33 +01:00
parent 15882d3503
commit 4e5734f6e9
1 changed files with 18 additions and 9 deletions

View File

@ -315,16 +315,19 @@ type printer struct {
func (p printer) run(ctx context.Context, cascadeStop bool, exitCodeFrom string, consumer compose.LogConsumer, stopFn func() error) (int, error) { //nolint:unparam func (p printer) run(ctx context.Context, cascadeStop bool, exitCodeFrom string, consumer compose.LogConsumer, stopFn func() error) (int, error) { //nolint:unparam
var aborting bool var aborting bool
var count int
for { for {
event := <-p.queue event := <-p.queue
switch event.Type { switch event.Type {
case compose.ContainerEventAttach: case compose.ContainerEventAttach:
consumer.Register(event.Service, event.Source) consumer.Register(event.Service, event.Source)
count++
case compose.ContainerEventExit: case compose.ContainerEventExit:
if !aborting { if !aborting {
consumer.Status(event.Service, event.Source, fmt.Sprintf("exited with code %d", event.ExitCode)) consumer.Status(event.Service, event.Source, fmt.Sprintf("exited with code %d", event.ExitCode))
} }
if cascadeStop && !aborting { if cascadeStop {
if !aborting {
aborting = true aborting = true
fmt.Println("Aborting on container exit...") fmt.Println("Aborting on container exit...")
err := stopFn() err := stopFn()
@ -336,6 +339,12 @@ func (p printer) run(ctx context.Context, cascadeStop bool, exitCodeFrom string,
logrus.Error(event.ExitCode) logrus.Error(event.ExitCode)
return event.ExitCode, nil return event.ExitCode, nil
} }
}
count--
if count == 0 {
// Last container terminated, done
return 0, nil
}
case compose.ContainerEventLog: case compose.ContainerEventLog:
if !aborting { if !aborting {
consumer.Log(event.Service, event.Source, event.Line) consumer.Log(event.Service, event.Source, event.Line)