Jelajahi Sumber

stop as all registered containers exited || cascadestop

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 4 tahun lalu
induk
melakukan
4e5734f6e9
1 mengubah file dengan 18 tambahan dan 9 penghapusan
  1. 18 9
      cli/cmd/compose/up.go

+ 18 - 9
cli/cmd/compose/up.go

@@ -315,26 +315,35 @@ type printer struct {
 
 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 count int
 	for {
 		event := <-p.queue
 		switch event.Type {
 		case compose.ContainerEventAttach:
 			consumer.Register(event.Service, event.Source)
+			count++
 		case compose.ContainerEventExit:
 			if !aborting {
 				consumer.Status(event.Service, event.Source, fmt.Sprintf("exited with code %d", event.ExitCode))
 			}
-			if cascadeStop && !aborting {
-				aborting = true
-				fmt.Println("Aborting on container exit...")
-				err := stopFn()
-				if err != nil {
-					return 0, err
+			if cascadeStop {
+				if !aborting {
+					aborting = true
+					fmt.Println("Aborting on container exit...")
+					err := stopFn()
+					if err != nil {
+						return 0, err
+					}
+				}
+				if exitCodeFrom == "" || exitCodeFrom == event.Service {
+					logrus.Error(event.ExitCode)
+					return event.ExitCode, nil
 				}
 			}
-			if exitCodeFrom == "" || exitCodeFrom == event.Service {
-				logrus.Error(event.ExitCode)
-				return event.ExitCode, nil
+			count--
+			if count == 0 {
+				// Last container terminated, done
+				return 0, nil
 			}
 		case compose.ContainerEventLog:
 			if !aborting {