소스 검색

stop as all registered containers exited || cascadestop

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 4 년 전
부모
커밋
4e5734f6e9
1개의 변경된 파일18개의 추가작업 그리고 9개의 파일을 삭제
  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
 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 {
-				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:
 		case compose.ContainerEventLog:
 			if !aborting {
 			if !aborting {