@@ -39,11 +39,11 @@ import (
3939 "github.com/docker/cli/cli-plugins/metadata"
4040 "github.com/docker/cli/cli/command"
4141 "github.com/docker/cli/pkg/kvfile"
42+ "github.com/docker/compose/v2/cmd/display"
4243 "github.com/docker/compose/v2/cmd/formatter"
4344 "github.com/docker/compose/v2/internal/tracing"
4445 "github.com/docker/compose/v2/pkg/api"
4546 "github.com/docker/compose/v2/pkg/compose"
46- ui "github.com/docker/compose/v2/pkg/progress"
4747 "github.com/docker/compose/v2/pkg/remote"
4848 "github.com/docker/compose/v2/pkg/utils"
4949 "github.com/morikuni/aec"
@@ -84,10 +84,16 @@ func rawEnv(r io.Reader, filename string, vars map[string]string, lookup func(ke
8484 return nil
8585}
8686
87+ var stdioToStdout bool
88+
8789func init () {
8890 // compose evaluates env file values for interpolation
8991 // `raw` format allows to load env_file with the same parser used by docker run --env-file
9092 dotenv .RegisterFormat ("raw" , rawEnv )
93+
94+ if v , ok := os .LookupEnv ("COMPOSE_STATUS_STDOUT" ); ok {
95+ stdioToStdout , _ = strconv .ParseBool (v )
96+ }
9197}
9298
9399// Command defines a compose CLI command as a func with args
@@ -116,7 +122,7 @@ func AdaptCmd(fn CobraCommand) func(cmd *cobra.Command, args []string) error {
116122 StatusCode : 130 ,
117123 }
118124 }
119- if ui .Mode == ui .ModeJSON {
125+ if display .Mode == display .ModeJSON {
120126 err = makeJSONError (err )
121127 }
122128 return err
@@ -486,49 +492,49 @@ func RootCommand(dockerCli command.Cli, backendOptions *BackendOptions) *cobra.C
486492 formatter .SetANSIMode (dockerCli , ansi )
487493
488494 if noColor , ok := os .LookupEnv ("NO_COLOR" ); ok && noColor != "" {
489- ui .NoColor ()
495+ display .NoColor ()
490496 formatter .SetANSIMode (dockerCli , formatter .Never )
491497 }
492498
493499 switch ansi {
494500 case "never" :
495- ui .Mode = ui .ModePlain
501+ display .Mode = display .ModePlain
496502 case "always" :
497- ui .Mode = ui .ModeTTY
503+ display .Mode = display .ModeTTY
498504 }
499505
500- var ep ui .EventProcessor
506+ var ep api .EventProcessor
501507 switch opts .Progress {
502- case "" , ui .ModeAuto :
508+ case "" , display .ModeAuto :
503509 switch {
504510 case ansi == "never" :
505- ui .Mode = ui .ModePlain
506- ep = ui . NewPlainWriter (dockerCli .Err ())
511+ display .Mode = display .ModePlain
512+ ep = display . Plain (dockerCli .Err ())
507513 case dockerCli .Out ().IsTerminal ():
508- ep = ui . NewTTYWriter (dockerCli .Err ())
514+ ep = display . Full (dockerCli .Err (), stdinfo ( dockerCli ))
509515 default :
510- ep = ui . NewPlainWriter (dockerCli .Err ())
516+ ep = display . Plain (dockerCli .Err ())
511517 }
512- case ui .ModeTTY :
518+ case display .ModeTTY :
513519 if ansi == "never" {
514520 return fmt .Errorf ("can't use --progress tty while ANSI support is disabled" )
515521 }
516- ui .Mode = ui .ModeTTY
517- ep = ui . NewTTYWriter (dockerCli .Err ())
522+ display .Mode = display .ModeTTY
523+ ep = display . Full (dockerCli .Err (), stdinfo ( dockerCli ))
518524
519- case ui .ModePlain :
525+ case display .ModePlain :
520526 if ansi == "always" {
521527 return fmt .Errorf ("can't use --progress plain while ANSI support is forced" )
522528 }
523- ui .Mode = ui .ModePlain
524- ep = ui . NewPlainWriter (dockerCli .Err ())
525- case ui .ModeQuiet , "none" :
526- ui .Mode = ui .ModeQuiet
527- ep = ui . NewQuietWriter ()
528- case ui .ModeJSON :
529- ui .Mode = ui .ModeJSON
529+ display .Mode = display .ModePlain
530+ ep = display . Plain (dockerCli .Err ())
531+ case display .ModeQuiet , "none" :
532+ display .Mode = display .ModeQuiet
533+ ep = display . Quiet ()
534+ case display .ModeJSON :
535+ display .Mode = display .ModeJSON
530536 logrus .SetFormatter (& logrus.JSONFormatter {})
531- ep = ui . NewJSONWriter (dockerCli .Err ())
537+ ep = display . JSON (dockerCli .Err ())
532538 default :
533539 return fmt .Errorf ("unsupported --progress value %q" , opts .Progress )
534540 }
@@ -658,6 +664,13 @@ func RootCommand(dockerCli command.Cli, backendOptions *BackendOptions) *cobra.C
658664 return c
659665}
660666
667+ func stdinfo (dockerCli command.Cli ) io.Writer {
668+ if stdioToStdout {
669+ return dockerCli .Out ()
670+ }
671+ return dockerCli .Err ()
672+ }
673+
661674func setEnvWithDotEnv (opts ProjectOptions ) error {
662675 options , err := cli .NewProjectOptions (opts .ConfigPaths ,
663676 cli .WithWorkingDirectory (opts .ProjectDir ),
@@ -683,9 +696,9 @@ func setEnvWithDotEnv(opts ProjectOptions) error {
683696}
684697
685698var printerModes = []string {
686- ui .ModeAuto ,
687- ui .ModeTTY ,
688- ui .ModePlain ,
689- ui .ModeJSON ,
690- ui .ModeQuiet ,
699+ display .ModeAuto ,
700+ display .ModeTTY ,
701+ display .ModePlain ,
702+ display .ModeJSON ,
703+ display .ModeQuiet ,
691704}
0 commit comments