From 57ed6ae6a68d1385f1450f03c7718b0c0593ffff Mon Sep 17 00:00:00 2001 From: cmeng Date: Mon, 20 Nov 2023 22:54:28 +1300 Subject: [PATCH] fix(edge-stack): parse docker compose multi lines json output EE-6317 (#10627) --- .../compose/internal/composeplugin/status.go | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/pkg/libstack/compose/internal/composeplugin/status.go b/pkg/libstack/compose/internal/composeplugin/status.go index ab06a8ac5..07ae648d3 100644 --- a/pkg/libstack/compose/internal/composeplugin/status.go +++ b/pkg/libstack/compose/internal/composeplugin/status.go @@ -1,8 +1,10 @@ package composeplugin import ( + "bytes" "context" "fmt" + "io" "time" "github.com/portainer/portainer/pkg/libstack" @@ -107,6 +109,7 @@ func (wrapper *PluginWrapper) WaitForStatus(ctx context.Context, name string, st errorMessageCh := make(chan string) go func() { + OUTER: for { select { case <-ctx.Done(): @@ -135,13 +138,23 @@ func (wrapper *PluginWrapper) WaitForStatus(ctx context.Context, name string, st } var services []service - err = json.Unmarshal(output, &services) - if err != nil { - log.Debug(). - Str("project_name", name). - Err(err). - Msg("failed to parse docker compose output") - continue + dec := json.NewDecoder(bytes.NewReader(output)) + for { + var svc service + + err := dec.Decode(&svc) + if err == io.EOF { + break + } + if err != nil { + log.Debug(). + Str("project_name", name). + Err(err). + Msg("failed to parse docker compose output") + continue OUTER + } + + services = append(services, svc) } if len(services) == 0 && status == libstack.StatusRemoved {