pretend cli.Out is a containerd console.File

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
Nicolas De Loof
2025-10-28 11:48:09 +01:00
committed by Guillaume Lours
parent 8274be8d08
commit bf50c99193
2 changed files with 36 additions and 2 deletions

2
go.mod
View File

@@ -9,6 +9,7 @@ require (
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d
github.com/buger/goterm v1.0.4
github.com/compose-spec/compose-go/v2 v2.9.0
github.com/containerd/console v1.0.5
github.com/containerd/containerd/v2 v2.1.4
github.com/containerd/errdefs v1.0.0
github.com/containerd/platforms v1.0.0-rc.1
@@ -80,7 +81,6 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/containerd/console v1.0.5 // indirect
github.com/containerd/containerd/api v1.9.0 // indirect
github.com/containerd/continuity v0.4.5 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect

View File

@@ -34,10 +34,12 @@ import (
"strings"
"github.com/compose-spec/compose-go/v2/types"
"github.com/containerd/console"
"github.com/containerd/errdefs"
"github.com/docker/cli/cli-plugins/manager"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/image/build"
"github.com/docker/cli/cli/streams"
"github.com/docker/compose/v2/pkg/api"
"github.com/docker/compose/v2/pkg/progress"
"github.com/docker/docker/api/types/versions"
@@ -144,7 +146,7 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
}
out = s.stdout()
}
display, err := progressui.NewDisplay(out, displayMode)
display, err := progressui.NewDisplay(makeConsole(out), displayMode)
if err != nil {
return nil, err
}
@@ -430,6 +432,38 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
return results, nil
}
// makeConsole wraps the provided writer to match [containerd.File] interface if it is of type *streams.Out.
// buildkit's NewDisplay doesn't actually require a [io.Reader], it only uses the [containerd.Console] type to
// benefits from ANSI capabilities, but only does writes.
func makeConsole(out io.Writer) io.Writer {
if s, ok := out.(*streams.Out); ok {
return &_console{s}
}
return out
}
var _ console.File = &_console{}
type _console struct {
*streams.Out
}
func (c _console) Read(p []byte) (n int, err error) {
return 0, errors.New("not implemented")
}
func (c _console) Close() error {
return nil
}
func (c _console) Fd() uintptr {
return c.FD()
}
func (c _console) Name() string {
return "compose"
}
func toBakeExtraHosts(hosts types.HostsList) map[string]string {
m := make(map[string]string)
for k, v := range hosts {