diff --git a/commands/bake.go b/commands/bake.go index 571385058598..b325c0e16e3e 100644 --- a/commands/bake.go +++ b/commands/bake.go @@ -162,7 +162,13 @@ func runBake(ctx context.Context, dockerCli command.Cli, targets []string, in ba attributes := bakeMetricAttributes(dockerCli, driverType, url, cmdContext, targets, &in) progressMode := progressui.DisplayMode(cFlags.progress) + var printer *progress.Printer + defer func() { + if printer != nil { + printer.Wait() + } + }() makePrinter := func() error { var err error diff --git a/util/progress/printer.go b/util/progress/printer.go index 85208b7e200e..38b90c493f8f 100644 --- a/util/progress/printer.go +++ b/util/progress/printer.go @@ -51,8 +51,8 @@ type Printer struct { func (p *Printer) Wait() error { p.closeOnce.Do(func() { close(p.status) - <-p.done }) + <-p.done return p.err } @@ -144,6 +144,7 @@ func NewPrinter(ctx context.Context, out console.File, mode progressui.DisplayMo interrupt: make(chan interruptRequest), state: printerStateRunning, done: make(chan struct{}), + metrics: opt.mw, } go pw.run(ctx, d) @@ -155,21 +156,21 @@ func (p *Printer) run(ctx context.Context, d progressui.Display) { defer close(p.interrupt) var ss []*client.SolveStatus - for p.state != printerStateDone { + for { switch p.state { case printerStatePaused: ss, p.err = p.bufferDisplay(ctx, ss) case printerStateRunning: - var warnings []client.VertexWarning - warnings, ss, p.err = p.updateDisplay(ctx, d, ss) - p.warnings = append(p.warnings, warnings...) - - d, _ = p.newDisplay() + p.warnings, ss, p.err = p.updateDisplay(ctx, d, ss) + if p.opt.onclose != nil { + p.opt.onclose() + } } - } - if p.opt.onclose != nil { - p.opt.onclose() + if p.state == printerStateDone { + break + } + d, _ = p.newDisplay() } }