controller: return solve response through api

Now clients can access the result of the solve, specifically the image
id output. This is a useful refactor, as well as being required if we
want to allow bake to invoke through the controller api.

This also allows us to remove the quiet option from the API, since we
can compute the required progress type outside of the controller, and
can print the image id from the result of the solve.

As a follow-up, we should also be able to remove the image id file
output from the controller api, now that the client has access to it.

Signed-off-by: Justin Chadwell <me@jedevc.com>
pull/1614/head
Justin Chadwell 2 years ago
parent 90d7fb5e77
commit 5c31d855fd

@ -1260,7 +1260,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
respMu.Lock() respMu.Lock()
resp[k] = &client.SolveResponse{ resp[k] = &client.SolveResponse{
ExporterResponse: map[string]string{ ExporterResponse: map[string]string{
"containerimage.digest": desc.Digest.String(), exptypes.ExporterImageDigestKey: desc.Digest.String(),
}, },
} }
respMu.Unlock() respMu.Unlock()

@ -5,6 +5,7 @@ import (
"encoding/base64" "encoding/base64"
"encoding/csv" "encoding/csv"
"encoding/json" "encoding/json"
"fmt"
"io" "io"
"os" "os"
"runtime" "runtime"
@ -21,6 +22,7 @@ import (
"github.com/docker/buildx/store/storeutil" "github.com/docker/buildx/store/storeutil"
"github.com/docker/buildx/util/buildflags" "github.com/docker/buildx/util/buildflags"
"github.com/docker/buildx/util/ioset" "github.com/docker/buildx/util/ioset"
"github.com/docker/buildx/util/progress"
"github.com/docker/buildx/util/tracing" "github.com/docker/buildx/util/tracing"
"github.com/docker/cli-docs-tool/annotation" "github.com/docker/cli-docs-tool/annotation"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
@ -54,7 +56,6 @@ type buildOptions struct {
outputs []string outputs []string
platforms []string platforms []string
printFunc string printFunc string
quiet bool
secrets []string secrets []string
shmSize dockeropts.MemBytes shmSize dockeropts.MemBytes
ssh []string ssh []string
@ -63,7 +64,9 @@ type buildOptions struct {
ulimits *dockeropts.UlimitOpt ulimits *dockeropts.UlimitOpt
invoke string invoke string
progress string progress string
quiet bool
controllerapi.CommonOptions controllerapi.CommonOptions
control.ControlOptions control.ControlOptions
@ -85,7 +88,6 @@ func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error)
NoCacheFilter: o.noCacheFilter, NoCacheFilter: o.noCacheFilter,
Platforms: o.platforms, Platforms: o.platforms,
PrintFunc: o.printFunc, PrintFunc: o.printFunc,
Quiet: o.quiet,
ShmSize: int64(o.shmSize), ShmSize: int64(o.shmSize),
Tags: o.tags, Tags: o.tags,
Target: o.target, Target: o.target,
@ -124,6 +126,22 @@ func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error)
return opts, nil return opts, nil
} }
func (o *buildOptions) toProgress() (string, error) {
switch o.progress {
case progress.PrinterModeAuto, progress.PrinterModeTty, progress.PrinterModePlain, progress.PrinterModeQuiet:
default:
return "", errors.Errorf("progress=%s is not a valid progress option", o.progress)
}
if o.quiet {
if o.progress != progress.PrinterModeAuto && o.progress != progress.PrinterModeQuiet {
return "", errors.Errorf("progress=%s and quiet cannot be used together", o.progress)
}
return progress.PrinterModeQuiet, nil
}
return o.progress, nil
}
func runBuild(dockerCli command.Cli, in buildOptions) error { func runBuild(dockerCli command.Cli, in buildOptions) error {
ctx := appcontext.Context() ctx := appcontext.Context()
@ -139,8 +157,18 @@ func runBuild(dockerCli command.Cli, in buildOptions) error {
if err != nil { if err != nil {
return err return err
} }
_, err = cbuild.RunBuild(ctx, dockerCli, opts, os.Stdin, in.progress, nil) progress, err := in.toProgress()
if err != nil {
return err return err
}
resp, _, err := cbuild.RunBuild(ctx, dockerCli, opts, os.Stdin, progress, nil)
if err != nil {
return err
}
if in.quiet {
fmt.Println(resp.ExporterResponse[exptypes.ExporterImageDigestKey])
}
return nil
} }
func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
@ -403,11 +431,6 @@ func updateLastActivity(dockerCli command.Cli, ng *store.NodeGroup) error {
func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) error { func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) error {
ctx := context.TODO() ctx := context.TODO()
if options.quiet && options.progress != "auto" && options.progress != "quiet" {
return errors.Errorf("progress=%s and quiet cannot be used together", options.progress)
} else if options.quiet {
options.progress = "quiet"
}
if options.invoke != "" && (options.dockerfileName == "-" || options.contextPath == "-") { if options.invoke != "" && (options.dockerfileName == "-" || options.contextPath == "-") {
// stdin must be usable for monitor // stdin must be usable for monitor
return errors.Errorf("Dockerfile or context from stdin is not supported with invoke") return errors.Errorf("Dockerfile or context from stdin is not supported with invoke")
@ -440,12 +463,16 @@ func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) er
}) })
f.SetReader(os.Stdin) f.SetReader(os.Stdin)
// Start build
opts, err := options.toControllerOptions() opts, err := options.toControllerOptions()
if err != nil { if err != nil {
return err return err
} }
ref, err := c.Build(ctx, opts, pr, os.Stdout, os.Stderr, options.progress) progress, err := options.toProgress()
if err != nil {
return err
}
// Start build
ref, resp, err := c.Build(ctx, opts, pr, os.Stdout, os.Stderr, progress)
if err != nil { if err != nil {
return errors.Wrapf(err, "failed to build") // TODO: allow invoke even on error return errors.Wrapf(err, "failed to build") // TODO: allow invoke even on error
} }
@ -456,6 +483,10 @@ func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) er
logrus.Debug("failed to close stdin pipe reader") logrus.Debug("failed to close stdin pipe reader")
} }
if options.quiet {
fmt.Println(resp.ExporterResponse[exptypes.ExporterImageDigestKey])
}
// post-build operations // post-build operations
if options.invoke != "" { if options.invoke != "" {
pr2, pw2 := io.Pipe() pr2, pw2 := io.Pipe()

@ -41,15 +41,9 @@ import (
const defaultTargetName = "default" const defaultTargetName = "default"
func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progressMode string, statusChan chan *client.SolveStatus) (res *build.ResultContext, err error) { func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progressMode string, statusChan chan *client.SolveStatus) (*client.SolveResponse, *build.ResultContext, error) {
if in.Opts.NoCache && len(in.NoCacheFilter) > 0 { if in.Opts.NoCache && len(in.NoCacheFilter) > 0 {
return nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together") return nil, nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together")
}
if in.Quiet && progressMode != progress.PrinterModeAuto && progressMode != progress.PrinterModeQuiet {
return nil, errors.Errorf("progress=%s and quiet cannot be used together", progressMode)
} else if in.Quiet {
progressMode = "quiet"
} }
contexts := map[string]build.NamedContext{} contexts := map[string]build.NamedContext{}
@ -59,7 +53,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
printFunc, err := parsePrintFunc(in.PrintFunc) printFunc, err := parsePrintFunc(in.PrintFunc)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
opts := build.Options{ opts := build.Options{
@ -86,7 +80,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
platforms, err := platformutil.Parse(in.Platforms) platforms, err := platformutil.Parse(in.Platforms)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
opts.Platforms = platforms opts.Platforms = platforms
@ -95,7 +89,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
secrets, err := controllerapi.CreateSecrets(in.Secrets) secrets, err := controllerapi.CreateSecrets(in.Secrets)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
opts.Session = append(opts.Session, secrets) opts.Session = append(opts.Session, secrets)
@ -105,17 +99,17 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
} }
ssh, err := controllerapi.CreateSSH(sshSpecs) ssh, err := controllerapi.CreateSSH(sshSpecs)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
opts.Session = append(opts.Session, ssh) opts.Session = append(opts.Session, ssh)
outputs, err := controllerapi.CreateExports(in.Exports) outputs, err := controllerapi.CreateExports(in.Exports)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
if in.Opts.ExportPush { if in.Opts.ExportPush {
if in.Opts.ExportLoad { if in.Opts.ExportLoad {
return nil, errors.Errorf("push and load may not be set together at the moment") return nil, nil, errors.Errorf("push and load may not be set together at the moment")
} }
if len(outputs) == 0 { if len(outputs) == 0 {
outputs = []client.ExportEntry{{ outputs = []client.ExportEntry{{
@ -129,7 +123,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
case "image": case "image":
outputs[0].Attrs["push"] = "true" outputs[0].Attrs["push"] = "true"
default: default:
return nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type) return nil, nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type)
} }
} }
} }
@ -143,7 +137,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
switch outputs[0].Type { switch outputs[0].Type {
case "docker": case "docker":
default: default:
return nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type) return nil, nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type)
} }
} }
} }
@ -158,7 +152,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
} }
opts.Attests, err = buildflags.ParseAttests(inAttests) opts.Attests, err = buildflags.ParseAttests(inAttests)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
opts.CacheFrom = controllerapi.CreateCaches(in.CacheFrom) opts.CacheFrom = controllerapi.CreateCaches(in.CacheFrom)
@ -166,7 +160,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
allow, err := buildflags.ParseEntitlements(in.Allow) allow, err := buildflags.ParseEntitlements(in.Allow)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
opts.Allow = allow opts.Allow = allow
@ -181,29 +175,25 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
builder.WithContextPathHash(contextPathHash), builder.WithContextPathHash(contextPathHash),
) )
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil { if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil {
return nil, errors.Wrapf(err, "failed to update builder last activity time") return nil, nil, errors.Wrapf(err, "failed to update builder last activity time")
} }
nodes, err := b.LoadNodes(ctx, false) nodes, err := b.LoadNodes(ctx, false)
if err != nil { if err != nil {
return nil, err return nil, nil, err
} }
imageID, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progressMode, in.Opts.MetadataFile, statusChan) resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progressMode, in.Opts.MetadataFile, statusChan)
err = wrapBuildError(err, false) err = wrapBuildError(err, false)
if err != nil { if err != nil {
return nil, err return nil, nil, err
}
if in.Quiet {
fmt.Println(imageID)
} }
return res, nil return resp, res, nil
} }
func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progressMode string, metadataFile string, statusChan chan *client.SolveStatus) (imageID string, res *build.ResultContext, err error) { func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progressMode string, metadataFile string, statusChan chan *client.SolveStatus) (*client.SolveResponse, *build.ResultContext, error) {
ctx2, cancel := context.WithCancel(context.TODO()) ctx2, cancel := context.WithCancel(context.TODO())
defer cancel() defer cancel()
@ -212,9 +202,10 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou
fmt.Sprintf("%s:%s", ng.Driver, ng.Name), fmt.Sprintf("%s:%s", ng.Driver, ng.Name),
)) ))
if err != nil { if err != nil {
return "", nil, err return nil, nil, err
} }
var res *build.ResultContext
var mu sync.Mutex var mu sync.Mutex
var idx int var idx int
resp, err := build.BuildWithResultHandler(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress.Tee(printer, statusChan), func(driverIndex int, gotRes *build.ResultContext) { resp, err := build.BuildWithResultHandler(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress.Tee(printer, statusChan), func(driverIndex int, gotRes *build.ResultContext) {
@ -229,12 +220,12 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou
err = err1 err = err1
} }
if err != nil { if err != nil {
return "", nil, err return nil, nil, err
} }
if len(metadataFile) > 0 && resp != nil { if len(metadataFile) > 0 && resp != nil {
if err := writeMetadataFile(metadataFile, decodeExporterResponse(resp[defaultTargetName].ExporterResponse)); err != nil { if err := writeMetadataFile(metadataFile, decodeExporterResponse(resp[defaultTargetName].ExporterResponse)); err != nil {
return "", nil, err return nil, nil, err
} }
} }
@ -243,12 +234,12 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou
for k := range resp { for k := range resp {
if opts[k].PrintFunc != nil { if opts[k].PrintFunc != nil {
if err := printResult(opts[k].PrintFunc, resp[k].ExporterResponse); err != nil { if err := printResult(opts[k].PrintFunc, resp[k].ExporterResponse); err != nil {
return "", nil, err return nil, nil, err
} }
} }
} }
return resp[defaultTargetName].ExporterResponse["containerimage.digest"], res, err return resp[defaultTargetName], res, err
} }
func printWarnings(w io.Writer, warnings []client.VertexWarning, mode string) { func printWarnings(w io.Writer, warnings []client.VertexWarning, mode string) {

@ -6,14 +6,15 @@ import (
"github.com/containerd/console" "github.com/containerd/console"
controllerapi "github.com/docker/buildx/controller/pb" controllerapi "github.com/docker/buildx/controller/pb"
"github.com/moby/buildkit/client"
) )
type BuildxController interface { type BuildxController interface {
Invoke(ctx context.Context, ref string, options controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (ref string, resp *client.SolveResponse, err error)
Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (ref string, err error) Invoke(ctx context.Context, ref string, options controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) (err error)
Kill(ctx context.Context) error Kill(ctx context.Context) error
Close() error Close() error
List(ctx context.Context) (res []string, _ error) List(ctx context.Context) (refs []string, _ error)
Disconnect(ctx context.Context, ref string) error Disconnect(ctx context.Context, ref string) error
} }

@ -10,6 +10,7 @@ import (
"github.com/docker/buildx/controller/control" "github.com/docker/buildx/controller/control"
controllerapi "github.com/docker/buildx/controller/pb" controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/moby/buildkit/client"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -26,6 +27,15 @@ type localController struct {
resultCtx *build.ResultContext resultCtx *build.ResultContext
} }
func (b *localController) Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, *client.SolveResponse, error) {
resp, res, err := cbuild.RunBuild(ctx, b.dockerCli, options, in, progressMode, nil)
if err != nil {
return "", nil, err
}
b.resultCtx = res
return b.ref, resp, nil
}
func (b *localController) Invoke(ctx context.Context, ref string, cfg controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error { func (b *localController) Invoke(ctx context.Context, ref string, cfg controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error {
if ref != b.ref { if ref != b.ref {
return errors.Errorf("unknown ref %q", ref) return errors.Errorf("unknown ref %q", ref)
@ -52,15 +62,6 @@ func (b *localController) Invoke(ctx context.Context, ref string, cfg controller
return build.Invoke(ctx, ccfg) return build.Invoke(ctx, ccfg)
} }
func (b *localController) Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, error) {
res, err := cbuild.RunBuild(ctx, b.dockerCli, options, in, progressMode, nil)
if err != nil {
return "", err
}
b.resultCtx = res
return b.ref, nil
}
func (b *localController) Kill(context.Context) error { func (b *localController) Kill(context.Context) error {
return nil // nop return nil // nop
} }

@ -89,13 +89,12 @@ type BuildOptions struct {
NetworkMode string `protobuf:"bytes,15,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"` NetworkMode string `protobuf:"bytes,15,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"`
NoCacheFilter []string `protobuf:"bytes,16,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"` NoCacheFilter []string `protobuf:"bytes,16,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"`
Platforms []string `protobuf:"bytes,17,rep,name=Platforms,proto3" json:"Platforms,omitempty"` Platforms []string `protobuf:"bytes,17,rep,name=Platforms,proto3" json:"Platforms,omitempty"`
Quiet bool `protobuf:"varint,18,opt,name=Quiet,proto3" json:"Quiet,omitempty"` Secrets []*Secret `protobuf:"bytes,18,rep,name=Secrets,proto3" json:"Secrets,omitempty"`
Secrets []*Secret `protobuf:"bytes,19,rep,name=Secrets,proto3" json:"Secrets,omitempty"` ShmSize int64 `protobuf:"varint,19,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"`
ShmSize int64 `protobuf:"varint,20,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"` SSH []*SSH `protobuf:"bytes,20,rep,name=SSH,proto3" json:"SSH,omitempty"`
SSH []*SSH `protobuf:"bytes,21,rep,name=SSH,proto3" json:"SSH,omitempty"` Tags []string `protobuf:"bytes,21,rep,name=Tags,proto3" json:"Tags,omitempty"`
Tags []string `protobuf:"bytes,22,rep,name=Tags,proto3" json:"Tags,omitempty"` Target string `protobuf:"bytes,22,opt,name=Target,proto3" json:"Target,omitempty"`
Target string `protobuf:"bytes,23,opt,name=Target,proto3" json:"Target,omitempty"` Ulimits *UlimitOpt `protobuf:"bytes,23,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
Ulimits *UlimitOpt `protobuf:"bytes,24,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
Opts *CommonOptions `protobuf:"bytes,25,opt,name=Opts,proto3" json:"Opts,omitempty"` Opts *CommonOptions `protobuf:"bytes,25,opt,name=Opts,proto3" json:"Opts,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
@ -245,13 +244,6 @@ func (m *BuildOptions) GetPlatforms() []string {
return nil return nil
} }
func (m *BuildOptions) GetQuiet() bool {
if m != nil {
return m.Quiet
}
return false
}
func (m *BuildOptions) GetSecrets() []*Secret { func (m *BuildOptions) GetSecrets() []*Secret {
if m != nil { if m != nil {
return m.Secrets return m.Secrets
@ -689,6 +681,7 @@ func (m *CommonOptions) GetProvenance() string {
} }
type BuildResponse struct { type BuildResponse struct {
ExporterResponse map[string]string `protobuf:"bytes,1,rep,name=ExporterResponse,proto3" json:"ExporterResponse,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -718,6 +711,13 @@ func (m *BuildResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_BuildResponse proto.InternalMessageInfo var xxx_messageInfo_BuildResponse proto.InternalMessageInfo
func (m *BuildResponse) GetExporterResponse() map[string]string {
if m != nil {
return m.ExporterResponse
}
return nil
}
type DisconnectRequest struct { type DisconnectRequest struct {
Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"` Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -1675,6 +1675,7 @@ func init() {
proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit") proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit")
proto.RegisterType((*CommonOptions)(nil), "buildx.controller.v1.CommonOptions") proto.RegisterType((*CommonOptions)(nil), "buildx.controller.v1.CommonOptions")
proto.RegisterType((*BuildResponse)(nil), "buildx.controller.v1.BuildResponse") proto.RegisterType((*BuildResponse)(nil), "buildx.controller.v1.BuildResponse")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildResponse.ExporterResponseEntry")
proto.RegisterType((*DisconnectRequest)(nil), "buildx.controller.v1.DisconnectRequest") proto.RegisterType((*DisconnectRequest)(nil), "buildx.controller.v1.DisconnectRequest")
proto.RegisterType((*DisconnectResponse)(nil), "buildx.controller.v1.DisconnectResponse") proto.RegisterType((*DisconnectResponse)(nil), "buildx.controller.v1.DisconnectResponse")
proto.RegisterType((*ListRequest)(nil), "buildx.controller.v1.ListRequest") proto.RegisterType((*ListRequest)(nil), "buildx.controller.v1.ListRequest")
@ -1699,111 +1700,112 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{ var fileDescriptor_ed7f10298fa1d90f = []byte{
// 1653 bytes of a gzipped FileDescriptorProto // 1672 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xef, 0x72, 0x1b, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x6e, 0x23, 0x49,
0x11, 0x67, 0x25, 0x59, 0x7f, 0x5a, 0x96, 0x93, 0x0c, 0xe1, 0x98, 0x13, 0xc7, 0xc5, 0xd9, 0xe4, 0x15, 0xa6, 0x6d, 0xc7, 0x3f, 0xc7, 0x71, 0x26, 0x53, 0x64, 0x97, 0x5e, 0xb3, 0xec, 0x64, 0x7a,
0x0e, 0x55, 0x1d, 0x25, 0xdf, 0xf9, 0x38, 0x72, 0x77, 0x09, 0x55, 0xd8, 0x92, 0x55, 0x16, 0x15, 0x66, 0x17, 0x4b, 0x8b, 0x9c, 0xdd, 0x2c, 0xcb, 0xec, 0xec, 0x0c, 0x12, 0x89, 0x1d, 0x2b, 0x46,
0xff, 0x61, 0x95, 0xe4, 0x0a, 0xa8, 0xe2, 0x6a, 0x2d, 0x8d, 0xe5, 0x2d, 0xad, 0x76, 0xc4, 0xce, 0xf9, 0x53, 0x3b, 0x33, 0x2b, 0x40, 0x62, 0xd4, 0xb1, 0x2b, 0x4e, 0xcb, 0xed, 0x2e, 0xd3, 0x55,
0x48, 0xb6, 0xf9, 0xc4, 0x13, 0xf0, 0x0a, 0x7c, 0xa6, 0x78, 0x04, 0x3e, 0xf1, 0x0e, 0xbc, 0x07, 0x76, 0x12, 0xae, 0xb8, 0xe5, 0x86, 0xf7, 0x40, 0x3c, 0x02, 0x57, 0xbc, 0x03, 0xef, 0x01, 0x8f,
0x3c, 0x02, 0xd5, 0x3d, 0xb3, 0xd2, 0x2a, 0xd2, 0x2a, 0x71, 0xf1, 0x49, 0xd3, 0xbd, 0xbf, 0x5f, 0x80, 0xce, 0xa9, 0x6a, 0xbb, 0x1d, 0xbb, 0x9d, 0x44, 0x5c, 0xa5, 0xea, 0xf4, 0xf7, 0x9d, 0x73,
0x77, 0x4f, 0x4f, 0x4f, 0xf7, 0xae, 0xe0, 0x7e, 0x5f, 0x46, 0x3a, 0x96, 0x61, 0x28, 0xe2, 0xe6, 0xea, 0xd4, 0xf9, 0x29, 0x07, 0x36, 0xbb, 0x22, 0x54, 0x91, 0x08, 0x02, 0x1e, 0xd5, 0x47, 0x91,
0x24, 0x96, 0x5a, 0xb2, 0x87, 0x17, 0xd3, 0x20, 0x1c, 0xdc, 0x34, 0x53, 0x0f, 0x66, 0x5f, 0xd4, 0x50, 0x82, 0x6d, 0x5d, 0x8c, 0xfd, 0xa0, 0x77, 0x53, 0x4f, 0x7c, 0x98, 0x7c, 0x5d, 0x7d, 0xd3,
0x9f, 0x0f, 0x03, 0x7d, 0x35, 0xbd, 0x68, 0xf6, 0xe5, 0x78, 0x6f, 0x2c, 0x2f, 0x6e, 0xf7, 0x08, 0xf7, 0xd5, 0xd5, 0xf8, 0xa2, 0xde, 0x15, 0xc3, 0x9d, 0xa1, 0xb8, 0xb8, 0xdd, 0x21, 0xd4, 0xc0,
0x35, 0x0a, 0xf4, 0x9e, 0x3f, 0x09, 0xf6, 0x94, 0x88, 0x67, 0x41, 0x5f, 0xa8, 0x3d, 0x4b, 0x4a, 0x57, 0x3b, 0xde, 0xc8, 0xdf, 0x91, 0x3c, 0x9a, 0xf8, 0x5d, 0x2e, 0x77, 0x0c, 0x29, 0xfe, 0xab,
0x7e, 0x8d, 0x49, 0xf7, 0x8f, 0xb0, 0x7d, 0x88, 0x70, 0x4f, 0xfc, 0x69, 0x2a, 0x94, 0x66, 0xf7, 0x55, 0x3a, 0x7f, 0x84, 0xf5, 0x7d, 0x84, 0xbb, 0xfc, 0x4f, 0x63, 0x2e, 0x15, 0xdb, 0x84, 0xac,
0x21, 0xef, 0x89, 0x4b, 0xee, 0xec, 0x3a, 0x8d, 0x8a, 0x87, 0x4b, 0xf6, 0x02, 0x4a, 0x67, 0x13, 0xcb, 0x2f, 0x6d, 0x6b, 0xdb, 0xaa, 0x95, 0x5c, 0x5c, 0xb2, 0xb7, 0x50, 0x38, 0x1d, 0x29, 0x5f,
0x1d, 0xc8, 0x48, 0xf1, 0xdc, 0xae, 0xd3, 0xa8, 0xee, 0xbb, 0xcd, 0x75, 0x61, 0x34, 0xc9, 0x8c, 0x84, 0xd2, 0xce, 0x6c, 0x5b, 0xb5, 0xf2, 0xae, 0x53, 0x5f, 0xe6, 0x46, 0x9d, 0xd4, 0x18, 0xa4,
0x45, 0x7a, 0x09, 0xc5, 0xfd, 0x1b, 0x58, 0x07, 0x56, 0xc1, 0x76, 0xa1, 0xda, 0x92, 0x91, 0x16, 0x1b, 0x53, 0x9c, 0xbf, 0x82, 0x31, 0x60, 0x04, 0x6c, 0x1b, 0xca, 0x0d, 0x11, 0x2a, 0x7e, 0xa3,
0x37, 0xfa, 0xdc, 0xd7, 0x57, 0xd6, 0x51, 0x5a, 0xc5, 0x3e, 0x85, 0x9d, 0xb6, 0xec, 0x8f, 0x44, 0xce, 0x3c, 0x75, 0x65, 0x0c, 0x25, 0x45, 0xec, 0x0b, 0xd8, 0x68, 0x8a, 0xee, 0x80, 0x47, 0x97,
0x7c, 0x19, 0x84, 0xe2, 0xd4, 0x1f, 0x0b, 0xf2, 0x5b, 0xf1, 0xde, 0xd2, 0xb2, 0x8f, 0xa0, 0x72, 0x7e, 0xc0, 0x4f, 0xbc, 0x21, 0x27, 0xbb, 0x25, 0xf7, 0x8e, 0x94, 0x7d, 0x0a, 0xa5, 0xb3, 0xc8,
0x1e, 0x07, 0x91, 0xee, 0x4c, 0xa3, 0x3e, 0xcf, 0x13, 0x64, 0xa1, 0x60, 0x7f, 0x80, 0x1a, 0xa2, 0x0f, 0x55, 0x6b, 0x1c, 0x76, 0xed, 0x2c, 0x41, 0x66, 0x02, 0xf6, 0x07, 0xa8, 0x20, 0xaa, 0x67,
0x06, 0xd6, 0xb2, 0xe2, 0x85, 0xdd, 0x7c, 0xa3, 0xba, 0xff, 0xd5, 0xbb, 0x83, 0x6f, 0x2e, 0xf1, 0x34, 0x4b, 0x3b, 0xb7, 0x9d, 0xad, 0x95, 0x77, 0xbf, 0xbd, 0xdf, 0xf9, 0xfa, 0x1c, 0xef, 0x20,
0x8e, 0x22, 0x1d, 0xdf, 0x7a, 0xcb, 0xb6, 0xd8, 0x43, 0xd8, 0x3a, 0x08, 0x43, 0x79, 0xcd, 0xb7, 0x54, 0xd1, 0xad, 0x3b, 0xaf, 0x8b, 0x6d, 0xc1, 0xda, 0x5e, 0x10, 0x88, 0x6b, 0x7b, 0x6d, 0x3b,
0x76, 0xf3, 0x8d, 0x8a, 0x67, 0x04, 0xc6, 0xa1, 0x74, 0xa0, 0xb5, 0x50, 0x5a, 0xf1, 0x22, 0xe9, 0x5b, 0x2b, 0xb9, 0x7a, 0xc3, 0x6c, 0x28, 0xec, 0x29, 0xc5, 0xa5, 0x92, 0x76, 0x9e, 0xe4, 0xf1,
0x13, 0x91, 0x9d, 0x41, 0x85, 0x3c, 0x1c, 0xc4, 0x43, 0xc5, 0x4b, 0x14, 0xc8, 0x17, 0xef, 0x11, 0x96, 0x9d, 0x42, 0x89, 0x2c, 0xec, 0x45, 0x7d, 0x69, 0x17, 0xc8, 0x91, 0xaf, 0x1f, 0xe0, 0xc8,
0xc8, 0x9c, 0x63, 0x82, 0x58, 0xd8, 0x60, 0x47, 0x50, 0x69, 0xf9, 0xfd, 0x2b, 0xd1, 0x89, 0xe5, 0x94, 0xa3, 0x9d, 0x98, 0xe9, 0x60, 0x07, 0x50, 0x6a, 0x78, 0xdd, 0x2b, 0xde, 0x8a, 0xc4, 0xd0,
0x98, 0x97, 0xc9, 0xe0, 0xcf, 0xd6, 0x1b, 0x24, 0x98, 0x35, 0x68, 0xcd, 0xcc, 0x99, 0xec, 0x00, 0x2e, 0x92, 0xc2, 0x9f, 0x2f, 0x57, 0x48, 0x30, 0xa3, 0xd0, 0xa8, 0x99, 0x32, 0xd9, 0x1e, 0x14,
0x4a, 0x24, 0xbc, 0x92, 0xbc, 0x72, 0x37, 0x23, 0x09, 0x8f, 0xb9, 0xb0, 0xdd, 0x1a, 0xc6, 0x72, 0x68, 0x73, 0x2e, 0xec, 0xd2, 0xe3, 0x94, 0xc4, 0x3c, 0xe6, 0xc0, 0x7a, 0xa3, 0x1f, 0x89, 0xf1,
0x3a, 0x39, 0xf7, 0x63, 0x11, 0x69, 0x0e, 0x74, 0x10, 0x4b, 0x3a, 0xf6, 0x1c, 0x4a, 0x47, 0x37, 0xe8, 0xcc, 0x8b, 0x78, 0xa8, 0x6c, 0xa0, 0x8b, 0x98, 0x93, 0xb1, 0x37, 0x50, 0x38, 0xb8, 0x19,
0x13, 0x19, 0x6b, 0xc5, 0xab, 0xe4, 0xe6, 0xf1, 0x7a, 0x37, 0x06, 0x64, 0x1d, 0x58, 0x06, 0xfb, 0x89, 0x48, 0x49, 0xbb, 0x4c, 0x66, 0x9e, 0x2f, 0x37, 0xa3, 0x41, 0xc6, 0x80, 0x61, 0xb0, 0xcf,
0x18, 0xe0, 0xe8, 0x46, 0xc7, 0xfe, 0xb1, 0xc4, 0xc4, 0x6e, 0x53, 0x62, 0x53, 0x1a, 0x2c, 0xa8, 0x00, 0x0e, 0x6e, 0x54, 0xe4, 0x1d, 0x0a, 0x0c, 0xec, 0x3a, 0x05, 0x36, 0x21, 0xc1, 0x84, 0x6a,
0xee, 0xd8, 0x1f, 0x8a, 0x6e, 0xbb, 0x13, 0x84, 0x82, 0xd7, 0x4c, 0x41, 0xa5, 0x54, 0xac, 0x03, 0x0f, 0xbd, 0x3e, 0x6f, 0x37, 0x5b, 0x7e, 0xc0, 0xed, 0x8a, 0x4e, 0xa8, 0x84, 0x88, 0xb5, 0x20,
0xc5, 0x97, 0xfe, 0x85, 0x08, 0x15, 0xdf, 0x21, 0xef, 0xcd, 0xf7, 0x48, 0xbd, 0x21, 0x98, 0x50, 0x7f, 0xe4, 0x5d, 0xf0, 0x40, 0xda, 0x1b, 0x64, 0xbd, 0xfe, 0x80, 0xd0, 0x6b, 0x82, 0x76, 0xc5,
0x2c, 0x1b, 0x3d, 0x9d, 0x0a, 0x7d, 0x2d, 0xe3, 0xd1, 0x89, 0x1c, 0x08, 0x7e, 0xcf, 0x78, 0x4a, 0xb0, 0xd1, 0xd2, 0x09, 0x57, 0xd7, 0x22, 0x1a, 0x1c, 0x8b, 0x1e, 0xb7, 0x9f, 0x68, 0x4b, 0x09,
0xa9, 0xd8, 0x53, 0xa8, 0x9d, 0x4a, 0x93, 0xde, 0x20, 0xd4, 0x22, 0xe6, 0xf7, 0x29, 0xdc, 0x65, 0x11, 0x7b, 0x09, 0x95, 0x13, 0xa1, 0xc3, 0xeb, 0x07, 0x8a, 0x47, 0xf6, 0x26, 0xb9, 0x3b, 0x2f,
0x25, 0x15, 0x6e, 0xe8, 0xeb, 0x4b, 0x19, 0x8f, 0x15, 0x7f, 0x40, 0x88, 0x85, 0x02, 0x6b, 0xeb, 0xa4, 0xc4, 0x0d, 0x3c, 0x75, 0x29, 0xa2, 0xa1, 0xb4, 0x9f, 0x12, 0x62, 0x26, 0x60, 0xbf, 0x82,
0xb7, 0xd3, 0x40, 0x68, 0xce, 0x76, 0x9d, 0x46, 0xd9, 0x33, 0x02, 0xfb, 0x25, 0x94, 0x7a, 0xa2, 0x42, 0x87, 0x77, 0x23, 0xae, 0xa4, 0xcd, 0xc8, 0xdd, 0x4f, 0x97, 0xbb, 0xab, 0x41, 0x6e, 0x0c,
0x1f, 0x0b, 0xad, 0xf8, 0x0f, 0x69, 0x13, 0x1f, 0xad, 0xdf, 0x84, 0x01, 0x79, 0x09, 0x18, 0x6b, 0xc6, 0xec, 0xeb, 0x5c, 0x0d, 0x3b, 0xfe, 0x9f, 0xb9, 0xfd, 0xe3, 0x6d, 0xab, 0x96, 0x75, 0xe3,
0xb2, 0x77, 0x35, 0xee, 0x05, 0x7f, 0x16, 0xfc, 0xe1, 0xae, 0xd3, 0xc8, 0x7b, 0x89, 0xc8, 0x3e, 0x2d, 0xfb, 0x12, 0xb2, 0x9d, 0xce, 0xa1, 0xbd, 0x45, 0xda, 0x3e, 0x49, 0xd1, 0xd6, 0x39, 0x74,
0x83, 0x7c, 0xaf, 0x77, 0xcc, 0x7f, 0x44, 0xd6, 0x3e, 0xcc, 0xb0, 0xd6, 0x3b, 0xf6, 0x10, 0xc5, 0x11, 0xc5, 0x18, 0xe4, 0xce, 0xbd, 0xbe, 0xb4, 0x3f, 0x22, 0xbf, 0x68, 0xcd, 0x3e, 0x86, 0xfc,
0x18, 0x14, 0x5e, 0xf9, 0x43, 0xc5, 0x3f, 0xa0, 0x68, 0x69, 0xcd, 0x3e, 0x80, 0xe2, 0x2b, 0x3f, 0xb9, 0x17, 0xf5, 0xb9, 0xb2, 0x3f, 0xa6, 0x33, 0x9b, 0x1d, 0x7b, 0x0d, 0x85, 0x77, 0x81, 0x3f,
0x1e, 0x0a, 0xcd, 0x7f, 0x4c, 0x99, 0xb0, 0x12, 0xfb, 0x06, 0x4a, 0xaf, 0xc3, 0x60, 0x1c, 0x68, 0xf4, 0x95, 0xb4, 0x7f, 0x42, 0xad, 0xe1, 0xd9, 0x72, 0xe5, 0x1a, 0x74, 0x3a, 0x52, 0x6e, 0x8c,
0xc5, 0x39, 0x35, 0x8c, 0x47, 0xeb, 0x8d, 0x1b, 0xd0, 0xd9, 0x44, 0x7b, 0x09, 0x9e, 0x3d, 0x83, 0x67, 0xaf, 0x20, 0x77, 0x3a, 0x52, 0xd2, 0xfe, 0x84, 0x78, 0x2f, 0x52, 0xd2, 0x4e, 0x0c, 0x87,
0xc2, 0xd9, 0x44, 0x2b, 0xfe, 0x21, 0xf1, 0x9e, 0x64, 0x14, 0xa3, 0x1c, 0x8f, 0x65, 0x94, 0x74, 0x22, 0x8c, 0x7b, 0x0a, 0x11, 0xaa, 0xbf, 0x01, 0xb6, 0x58, 0x9f, 0xd8, 0xb6, 0x06, 0xfc, 0x36,
0x1a, 0x22, 0xd4, 0x7f, 0x0d, 0x6c, 0xf5, 0xd6, 0x62, 0x33, 0x1b, 0x89, 0xdb, 0xa4, 0x99, 0x8d, 0x6e, 0x5b, 0x03, 0x7e, 0x8b, 0x25, 0x3a, 0xf1, 0x82, 0x71, 0xdc, 0x3c, 0xf4, 0xe6, 0xfb, 0xcc,
0xc4, 0x2d, 0x26, 0x77, 0xe6, 0x87, 0xd3, 0xa4, 0xa5, 0x18, 0xe1, 0xdb, 0xdc, 0xd7, 0x4e, 0xfd, 0x77, 0x56, 0xf5, 0x2d, 0x6c, 0xcc, 0x17, 0xd6, 0xa3, 0xd8, 0xaf, 0xa1, 0x9c, 0xc8, 0x8d, 0xc7,
0x05, 0xec, 0x2c, 0x5f, 0xb7, 0x3b, 0xb1, 0xbf, 0x81, 0x6a, 0xaa, 0x62, 0xee, 0x42, 0x75, 0xff, 0x50, 0x9d, 0x7f, 0x59, 0x50, 0x4e, 0xa4, 0x38, 0x85, 0xfa, 0x76, 0xc4, 0x0d, 0x99, 0xd6, 0x6c,
0xe5, 0x40, 0x35, 0x55, 0xf8, 0x94, 0xea, 0xdb, 0x89, 0xb0, 0x64, 0x5a, 0xb3, 0x43, 0xd8, 0x3a, 0x1f, 0xd6, 0xf6, 0x94, 0x8a, 0xb0, 0xd7, 0xe2, 0x6d, 0xfd, 0xe2, 0xde, 0x42, 0xa9, 0x13, 0x5c,
0xd0, 0x3a, 0xc6, 0x0e, 0x8c, 0xa7, 0xf5, 0xf3, 0x77, 0x5e, 0x9f, 0x26, 0xc1, 0x4d, 0xf9, 0x1a, 0x27, 0xaa, 0xa6, 0x62, 0x9e, 0x36, 0xb9, 0x54, 0x7e, 0xe8, 0x61, 0xe0, 0x4c, 0x6b, 0x4c, 0x8a,
0x2a, 0x56, 0x6f, 0x5b, 0x28, 0x1d, 0x44, 0x3e, 0x26, 0xce, 0x36, 0xcc, 0xb4, 0xaa, 0xfe, 0x35, 0xaa, 0xdf, 0x01, 0xcc, 0x68, 0x8f, 0x3a, 0xc3, 0x3f, 0x2c, 0x78, 0xba, 0xd0, 0x0d, 0x96, 0x9e,
0xc0, 0x82, 0x76, 0xa7, 0x3d, 0xfc, 0xc3, 0x81, 0x07, 0x2b, 0x3d, 0x62, 0xed, 0x4e, 0x8e, 0x97, 0xe4, 0x70, 0xfe, 0x24, 0xbb, 0x0f, 0xec, 0x2c, 0x8b, 0xe7, 0xf9, 0x3f, 0xbc, 0xd5, 0x99, 0xcf,
0x77, 0xb2, 0xff, 0x9e, 0xfd, 0x66, 0x75, 0x3f, 0xff, 0x47, 0xb4, 0xa6, 0xf2, 0xd9, 0x0e, 0xe4, 0x36, 0x20, 0xd3, 0x6e, 0x1a, 0x46, 0xa6, 0xdd, 0x44, 0x02, 0x4e, 0x1a, 0xed, 0x5a, 0xc9, 0xd5,
0xba, 0x6d, 0xcb, 0xc8, 0x75, 0xdb, 0x48, 0xc0, 0xf9, 0x63, 0x42, 0xab, 0x78, 0x46, 0x70, 0x3b, 0x1b, 0xa7, 0x05, 0x79, 0x5d, 0x4b, 0x0b, 0xf8, 0x2a, 0x14, 0xb1, 0x91, 0xd0, 0xc0, 0xd2, 0x36,
0x50, 0x34, 0x77, 0x69, 0x05, 0x5f, 0x87, 0x32, 0xb6, 0x17, 0x1a, 0x63, 0xc6, 0xc7, 0x5c, 0xc6, 0xa6, 0x7b, 0x74, 0xe7, 0x20, 0x9c, 0x98, 0x20, 0xe3, 0xd2, 0xf9, 0xbb, 0x05, 0xa5, 0x69, 0xc6,
0x70, 0x8e, 0xa2, 0x99, 0x4d, 0x32, 0x2e, 0xdd, 0xbf, 0x3b, 0x50, 0x99, 0x57, 0x3c, 0x6b, 0x41, 0xb3, 0x06, 0xe4, 0xc9, 0x1f, 0x69, 0x5b, 0x14, 0x87, 0x2f, 0xef, 0x29, 0x91, 0xfa, 0x7b, 0x42,
0x91, 0xe2, 0x51, 0xdc, 0xa1, 0x3c, 0x7c, 0xf6, 0x8e, 0x2b, 0xd2, 0x7c, 0x43, 0x68, 0xdb, 0x8f, 0x9b, 0xce, 0xa3, 0xa9, 0xd5, 0x1f, 0xa0, 0x9c, 0x10, 0x2f, 0x09, 0xc1, 0x6e, 0x32, 0x04, 0xa9,
0x0c, 0xb5, 0xfe, 0x1d, 0x54, 0x53, 0xea, 0x35, 0x29, 0xd8, 0x4f, 0xa7, 0x20, 0xb3, 0x65, 0x18, 0x2d, 0x43, 0x1b, 0x49, 0x06, 0xa8, 0x09, 0x79, 0x2d, 0xc4, 0x2b, 0xa4, 0x59, 0x6b, 0xae, 0x90,
0x27, 0xe9, 0x04, 0xb5, 0xa1, 0x68, 0x94, 0x78, 0x84, 0x34, 0x81, 0xed, 0x11, 0xd2, 0xdc, 0x65, 0x26, 0x2c, 0x83, 0xdc, 0xa1, 0x17, 0xf5, 0x48, 0x69, 0xd6, 0xa5, 0x35, 0xca, 0x3a, 0xe2, 0x52,
0x50, 0x38, 0xf6, 0xe3, 0x01, 0x19, 0xcd, 0x7b, 0xb4, 0x46, 0x5d, 0x4f, 0x5e, 0x6a, 0xda, 0x70, 0xd1, 0x81, 0xb3, 0x2e, 0xad, 0x9d, 0xff, 0x58, 0x50, 0x99, 0xab, 0x55, 0x6c, 0x46, 0x54, 0x63,
0xde, 0xa3, 0xb5, 0xfb, 0x1f, 0x07, 0x6a, 0x4b, 0x77, 0x15, 0x9b, 0x11, 0xdd, 0x31, 0x11, 0x5b, 0x3c, 0x32, 0x0a, 0xe3, 0x2d, 0xce, 0x8b, 0x63, 0xae, 0xbc, 0x9e, 0xa7, 0x3c, 0xea, 0xd7, 0x3a,
0x83, 0x89, 0x88, 0x53, 0xe4, 0x44, 0x68, 0x7f, 0xe0, 0x6b, 0x9f, 0xba, 0xb8, 0xc9, 0xe7, 0x92, 0x9e, 0x73, 0x32, 0x64, 0x9b, 0x8e, 0x49, 0x66, 0x8a, 0x6e, 0xbc, 0x45, 0xeb, 0x67, 0xe3, 0x20,
0x0e, 0xd9, 0xb6, 0x8f, 0x92, 0x9b, 0xb2, 0x97, 0x88, 0xe8, 0xfd, 0x7c, 0x1a, 0x86, 0xbc, 0x40, 0xb0, 0x73, 0x24, 0xa6, 0xb5, 0x1e, 0x10, 0x58, 0x0f, 0x67, 0x63, 0x79, 0x65, 0xaf, 0xd1, 0x97,
0x6a, 0x5a, 0x9b, 0xb1, 0x81, 0xf7, 0xe1, 0x7c, 0xaa, 0xae, 0xf8, 0x16, 0x3d, 0x49, 0x69, 0x16, 0x84, 0x64, 0xf6, 0xfd, 0x48, 0x78, 0x3d, 0x3b, 0x9f, 0xfc, 0x8e, 0x12, 0x3a, 0xd1, 0xfe, 0xe9,
0xcf, 0x5f, 0x4a, 0x7f, 0xc0, 0x8b, 0xe9, 0xe7, 0xa8, 0xa1, 0x1d, 0x1d, 0x9e, 0x9d, 0xf0, 0x92, 0xb1, 0x5d, 0xd0, 0x27, 0xc7, 0x35, 0x72, 0xce, 0x22, 0x31, 0xe1, 0xa1, 0x17, 0x76, 0xb9, 0x5d,
0xd9, 0x39, 0xae, 0x91, 0x73, 0x1e, 0xcb, 0x99, 0x88, 0xfc, 0xa8, 0x2f, 0x78, 0x99, 0x9e, 0xa4, 0xa4, 0x2f, 0x09, 0x89, 0xf3, 0x4f, 0x0b, 0x2a, 0xe6, 0xdd, 0x24, 0x47, 0x22, 0x94, 0x9c, 0x71,
0x34, 0xee, 0x3d, 0xa8, 0xd9, 0x97, 0x29, 0x35, 0x91, 0x91, 0x12, 0xee, 0x27, 0xf0, 0xa0, 0x1d, 0xd8, 0xd4, 0x3a, 0x79, 0x14, 0xcb, 0xcc, 0x8d, 0xbf, 0x5e, 0x31, 0x6e, 0x62, 0x68, 0xfd, 0x2e,
0xa8, 0xbe, 0x8c, 0x22, 0xd1, 0xd7, 0x99, 0xaf, 0x58, 0xee, 0x43, 0x60, 0x69, 0x98, 0x25, 0x3f, 0x57, 0xdf, 0xff, 0x82, 0xca, 0x6a, 0x03, 0x3e, 0x5a, 0x0a, 0x7d, 0x54, 0x59, 0x7c, 0x0e, 0x4f,
0x82, 0xea, 0xcb, 0x40, 0x6d, 0xa0, 0xb9, 0xb0, 0x6d, 0x00, 0x86, 0x80, 0x21, 0x8f, 0xc4, 0xad, 0x9b, 0xbe, 0xec, 0x8a, 0x30, 0xe4, 0x5d, 0x95, 0xfa, 0xf2, 0x73, 0xb6, 0x80, 0x25, 0x61, 0xda,
0x29, 0xa9, 0x8a, 0x47, 0x6b, 0xf7, 0xaf, 0x0e, 0x6c, 0x77, 0xa3, 0xc9, 0x54, 0x9f, 0x08, 0xa5, 0x9a, 0xf3, 0x0c, 0xca, 0x47, 0xbe, 0x5c, 0x41, 0x73, 0x60, 0x5d, 0x03, 0x4c, 0x64, 0x18, 0xe4,
0xfc, 0xa1, 0x60, 0x2f, 0xa0, 0xd0, 0x8d, 0x02, 0x4d, 0x76, 0xaa, 0xfb, 0x9f, 0xae, 0x2f, 0x09, 0x06, 0xfc, 0x56, 0xe7, 0x7f, 0xc9, 0xa5, 0xb5, 0xf3, 0x37, 0x0b, 0xd6, 0xdb, 0xe1, 0x68, 0xac,
0x62, 0x20, 0xcc, 0xb2, 0x8e, 0x7f, 0xe0, 0x11, 0x0b, 0x1b, 0x74, 0xdb, 0xd7, 0xbe, 0x2d, 0xa8, 0x8e, 0xb9, 0x94, 0x5e, 0x9f, 0xb3, 0xb7, 0x90, 0x6b, 0x87, 0xbe, 0x22, 0x3d, 0xe5, 0xdd, 0x2f,
0x8c, 0x31, 0x8e, 0x88, 0x14, 0x11, 0xc5, 0xc3, 0x12, 0x6c, 0x91, 0x51, 0xf7, 0x29, 0xdc, 0x7f, 0x96, 0x87, 0x8c, 0x18, 0x08, 0x33, 0xac, 0xc3, 0x1f, 0xb9, 0xc4, 0xc2, 0x69, 0xd2, 0xf4, 0x94,
0xdb, 0xfa, 0x9a, 0xad, 0x7d, 0x09, 0xd5, 0x94, 0x15, 0xba, 0x4e, 0x67, 0x1d, 0x02, 0x94, 0x3d, 0x67, 0xb2, 0x3f, 0xe5, 0x75, 0x81, 0x88, 0x04, 0x11, 0xb7, 0xfb, 0x05, 0x58, 0x23, 0xa5, 0xce,
0x5c, 0xe2, 0x5e, 0xe7, 0x81, 0x6c, 0x1b, 0x1f, 0x98, 0x7e, 0x32, 0x3d, 0xcf, 0xe0, 0x5f, 0x72, 0x4b, 0xd8, 0xbc, 0xab, 0x7d, 0xc9, 0xd1, 0xbe, 0x81, 0x72, 0x42, 0x0b, 0xd5, 0xfe, 0x69, 0x8b,
0x50, 0x4a, 0x4c, 0x3c, 0x5b, 0xda, 0xf7, 0xe3, 0xac, 0x7d, 0xaf, 0x6e, 0xf9, 0x2b, 0x28, 0xcc, 0x00, 0x45, 0x17, 0x97, 0x78, 0xd6, 0xa9, 0x23, 0xeb, 0xda, 0x86, 0xf3, 0x04, 0x2a, 0xa4, 0x7a,
0x4b, 0x32, 0x73, 0x96, 0x75, 0x06, 0x29, 0x1a, 0x55, 0xeb, 0xaf, 0xa0, 0xe8, 0x09, 0x85, 0x73, 0x1a, 0xc1, 0xbf, 0x64, 0xa0, 0x10, 0xab, 0x78, 0x35, 0x77, 0xee, 0xe7, 0x69, 0xe7, 0x5e, 0x3c,
0x37, 0xbf, 0x69, 0x98, 0x19, 0xcc, 0x82, 0x6c, 0x49, 0x48, 0xef, 0x05, 0xc3, 0xc8, 0x37, 0x45, 0xf2, 0xb7, 0x90, 0x9b, 0xd6, 0x4f, 0xea, 0xe0, 0x6d, 0xf5, 0x12, 0x34, 0x2a, 0xad, 0x5f, 0x43,
0x9d, 0x49, 0x37, 0x98, 0x14, 0xdd, 0x28, 0x16, 0xe9, 0x9e, 0x40, 0x75, 0x63, 0xa6, 0xd9, 0x19, 0xde, 0xe5, 0x12, 0x1f, 0x09, 0xd9, 0x55, 0x93, 0x57, 0x63, 0x66, 0x64, 0x43, 0x42, 0x7a, 0xc7,
0xdc, 0xc3, 0xa1, 0xe9, 0x07, 0x91, 0x88, 0x5b, 0x32, 0xba, 0x0c, 0x86, 0x76, 0xa7, 0x9f, 0x64, 0xef, 0x87, 0x9e, 0xae, 0xc0, 0x54, 0xba, 0xc6, 0x24, 0xe8, 0x5a, 0x30, 0x0b, 0xf7, 0x08, 0xca,
0x4d, 0xdf, 0x25, 0xb0, 0xf7, 0x36, 0xdb, 0xfd, 0xa7, 0xb3, 0x62, 0x91, 0x2e, 0x1b, 0xf6, 0xa8, 0x2b, 0x23, 0xcd, 0x4e, 0xe1, 0x09, 0x4e, 0x78, 0xcf, 0x0f, 0x79, 0xd4, 0x10, 0xe1, 0xa5, 0xdf,
0x89, 0x0c, 0x22, 0x6d, 0xeb, 0x33, 0xa5, 0xc1, 0xb0, 0x5a, 0xe3, 0x81, 0x6d, 0xbc, 0xb8, 0x5c, 0x37, 0x27, 0xfd, 0x3c, 0xed, 0xa9, 0x30, 0x07, 0x76, 0xef, 0xb2, 0xb1, 0x62, 0xef, 0xca, 0xa8,
0x34, 0xd0, 0xbc, 0x6d, 0xa0, 0x78, 0xe2, 0xaf, 0x95, 0x88, 0x29, 0x1f, 0x15, 0x8f, 0xd6, 0xf8, 0x33, 0x60, 0xf1, 0x8c, 0x84, 0x1f, 0x2a, 0x93, 0x9f, 0x09, 0x09, 0xba, 0xd5, 0x18, 0xf6, 0xcc,
0x0a, 0x72, 0x2a, 0x49, 0x6b, 0x2e, 0xb8, 0x95, 0xc8, 0xde, 0xb5, 0xb9, 0xd5, 0x68, 0xef, 0x7a, 0x94, 0xc0, 0xe5, 0xac, 0xdb, 0x67, 0x4d, 0xb7, 0xc7, 0x1b, 0x7f, 0x27, 0x79, 0x44, 0xf1, 0x28,
0x80, 0xcd, 0xfd, 0x54, 0xa2, 0xae, 0x64, 0xde, 0xaa, 0x48, 0x40, 0xdc, 0x2b, 0x7d, 0x4b, 0x37, 0xb9, 0xb4, 0xc6, 0xf7, 0xd2, 0x89, 0x20, 0xa9, 0xee, 0x46, 0x66, 0x47, 0xfa, 0xae, 0x75, 0x0b,
0xb9, 0xec, 0xe1, 0xd2, 0x3d, 0x80, 0xca, 0xfc, 0x2c, 0xb1, 0xe3, 0x77, 0x06, 0x94, 0xac, 0x9a, 0x42, 0x7d, 0xd7, 0x3d, 0xac, 0xd1, 0x13, 0x81, 0xb2, 0x02, 0x01, 0xf5, 0x06, 0x71, 0xe7, 0xea,
0x97, 0xeb, 0x0c, 0x92, 0x32, 0xcc, 0xad, 0x96, 0x61, 0x3e, 0x55, 0x86, 0xcf, 0xa0, 0xb6, 0x74, 0x96, 0xda, 0x4e, 0xd1, 0xc5, 0xa5, 0xb3, 0x07, 0xa5, 0xe9, 0x5d, 0xe2, 0x78, 0x6a, 0xf5, 0x28,
0xaa, 0x08, 0xf2, 0xe4, 0xb5, 0xb2, 0x86, 0x68, 0x8d, 0xba, 0x96, 0x0c, 0xcd, 0x27, 0x55, 0xcd, 0x58, 0x15, 0x37, 0xd3, 0xea, 0xc5, 0x69, 0x98, 0x59, 0x4c, 0xc3, 0x6c, 0x22, 0x0d, 0x5f, 0x41,
0xa3, 0xb5, 0xfb, 0x04, 0x6a, 0x4b, 0xe7, 0xb9, 0xae, 0xfb, 0xba, 0x8f, 0xa1, 0xd6, 0xd3, 0xbe, 0x65, 0xee, 0x56, 0x11, 0xe4, 0x8a, 0x6b, 0x69, 0x14, 0xd1, 0x1a, 0x65, 0x0d, 0x11, 0xe8, 0x5f,
0x9e, 0xaa, 0xec, 0xbe, 0xf0, 0x5f, 0x07, 0x76, 0x12, 0x8c, 0x6d, 0x0d, 0xbf, 0x80, 0xf2, 0x4c, 0x7a, 0x15, 0x97, 0xd6, 0xce, 0x0b, 0xa8, 0xcc, 0xdd, 0xe7, 0xb2, 0x51, 0xe1, 0x3c, 0x87, 0x4a,
0xc4, 0x5a, 0xdc, 0xcc, 0x27, 0x0e, 0x6f, 0xe2, 0xb7, 0x62, 0x33, 0xf9, 0x56, 0xc4, 0xa3, 0x7d, 0x47, 0x79, 0x6a, 0x2c, 0xd3, 0xfb, 0xc2, 0x7f, 0x2d, 0xd8, 0x88, 0x31, 0xa6, 0x35, 0xfc, 0x12,
0x43, 0x08, 0x6f, 0x8e, 0x64, 0xdf, 0x42, 0x59, 0x91, 0x1d, 0x91, 0xcc, 0xeb, 0x8f, 0xb3, 0x58, 0x8a, 0x13, 0x1e, 0x29, 0x7e, 0x33, 0x1d, 0x8f, 0x76, 0x1d, 0x7f, 0xc2, 0xd6, 0xe3, 0x9f, 0xb0,
0xd6, 0xdf, 0x1c, 0xcf, 0xf6, 0xa0, 0x10, 0xca, 0xa1, 0xa2, 0x13, 0xac, 0xee, 0xff, 0x24, 0x8b, 0x78, 0xb5, 0xef, 0x09, 0xe1, 0x4e, 0x91, 0xec, 0x7b, 0x28, 0x4a, 0xd2, 0xc3, 0xe3, 0xc7, 0xc5,
0xf7, 0x52, 0x0e, 0x3d, 0x02, 0xb2, 0xe7, 0x50, 0xbe, 0xf6, 0xe3, 0x28, 0x88, 0x86, 0xc9, 0xb7, 0x67, 0x69, 0x2c, 0x63, 0x6f, 0x8a, 0x67, 0x3b, 0x90, 0x0b, 0x44, 0x5f, 0xd2, 0x0d, 0x96, 0x77,
0xda, 0xa3, 0x2c, 0xd2, 0x77, 0x06, 0xe7, 0xcd, 0x09, 0x6e, 0x0d, 0xcb, 0xfc, 0x52, 0xda, 0x9c, 0x7f, 0x9a, 0xc6, 0x3b, 0x12, 0x7d, 0x97, 0x80, 0xec, 0x0d, 0x14, 0xaf, 0xbd, 0x28, 0xf4, 0xc3,
0xb8, 0xbf, 0xc3, 0xa6, 0x87, 0xa2, 0xdd, 0x7e, 0x17, 0x6a, 0xa6, 0x98, 0xdf, 0x88, 0x58, 0xe1, 0x7e, 0xfc, 0x13, 0xf2, 0x59, 0x1a, 0xe9, 0x07, 0x8d, 0x73, 0xa7, 0x04, 0xa7, 0x82, 0x69, 0x7e,
0xdb, 0x8f, 0xb3, 0xe9, 0x52, 0x1d, 0xa6, 0xa1, 0xde, 0x32, 0xd3, 0xfd, 0xde, 0xf6, 0xf8, 0x44, 0x29, 0x4c, 0x4c, 0x9c, 0xdf, 0x61, 0xd3, 0xc3, 0xad, 0x39, 0x7e, 0x1b, 0x2a, 0x3a, 0x99, 0xdf,
0x81, 0x63, 0x69, 0xe2, 0xf7, 0x47, 0xfe, 0x30, 0x39, 0xa7, 0x44, 0xc4, 0x27, 0x33, 0xeb, 0xcf, 0xf3, 0x48, 0xe2, 0x53, 0xcd, 0x5a, 0x55, 0x54, 0xfb, 0x49, 0xa8, 0x3b, 0xcf, 0x74, 0x3e, 0x98,
0xcc, 0xb3, 0x44, 0xc4, 0x57, 0x87, 0x58, 0xcc, 0x02, 0xb5, 0x78, 0x11, 0x9b, 0xcb, 0xfb, 0xff, 0x79, 0x14, 0x0b, 0x70, 0x86, 0x8e, 0xbc, 0xee, 0xc0, 0xeb, 0xc7, 0xf7, 0x14, 0x6f, 0xf1, 0xcb,
0x2e, 0x00, 0xb4, 0xe6, 0xf1, 0xb0, 0x73, 0xd8, 0x22, 0x7f, 0x6c, 0xd3, 0x67, 0xb7, 0xdd, 0x77, 0xc4, 0xd8, 0xd3, 0x93, 0x21, 0xde, 0xe2, 0x3b, 0x27, 0xe2, 0x13, 0x5f, 0xce, 0x5e, 0x8d, 0xd3,
0xfd, 0xc9, 0x46, 0x8c, 0x4d, 0xc6, 0x6b, 0x28, 0x9a, 0xd3, 0x62, 0x59, 0x4d, 0x25, 0x5d, 0x5f, 0xfd, 0xee, 0xbf, 0x73, 0x00, 0x8d, 0xa9, 0x3f, 0xec, 0x0c, 0xd6, 0xc8, 0x1e, 0x73, 0x56, 0x4e,
0xf5, 0xa7, 0x9b, 0x41, 0xc6, 0xe8, 0xe7, 0x0e, 0xf3, 0x6c, 0xcb, 0xc9, 0x0a, 0x34, 0x3d, 0x85, 0x37, 0x3a, 0x77, 0xf5, 0xc5, 0x03, 0x26, 0x20, 0x7b, 0x07, 0x79, 0x7d, 0x5b, 0x2c, 0xad, 0xa9,
0xb2, 0x02, 0x5d, 0x6a, 0xdf, 0x0d, 0x87, 0xfd, 0x06, 0x8a, 0xdd, 0x68, 0x26, 0x47, 0x82, 0xfd, 0x24, 0xf3, 0xab, 0xfa, 0x72, 0x35, 0x48, 0x2b, 0xfd, 0xca, 0x62, 0xae, 0x69, 0x39, 0x69, 0x8e,
0x74, 0x3d, 0x21, 0xb1, 0xb7, 0xf9, 0x71, 0xc3, 0xf9, 0xdc, 0x61, 0x27, 0x50, 0xc0, 0x69, 0xc9, 0x26, 0xa7, 0x50, 0x9a, 0xa3, 0x73, 0xed, 0xbb, 0x66, 0xb1, 0xdf, 0x42, 0xbe, 0x1d, 0x4e, 0xc4,
0x32, 0x5a, 0x7f, 0x6a, 0xd4, 0xd6, 0xdd, 0x4d, 0x10, 0x9b, 0xc5, 0xef, 0x01, 0x16, 0x33, 0x9b, 0x80, 0xb3, 0x9f, 0x2d, 0x27, 0xc4, 0xfa, 0x56, 0x7f, 0xae, 0x59, 0x5f, 0x59, 0xec, 0x18, 0x72,
0x65, 0x7c, 0x37, 0xaf, 0x0c, 0xff, 0x7a, 0xe3, 0xdd, 0x40, 0xeb, 0xe0, 0x04, 0x07, 0xd6, 0xa5, 0x38, 0x2d, 0x59, 0x4a, 0xeb, 0x4f, 0x8c, 0xda, 0xaa, 0xb3, 0x0a, 0x62, 0xa2, 0xf8, 0x01, 0x60,
0x64, 0x99, 0xa3, 0x6a, 0x5e, 0xee, 0x75, 0x77, 0x13, 0xc4, 0x98, 0x3b, 0x2c, 0xfc, 0x3e, 0x37, 0x36, 0xb3, 0x59, 0xca, 0xcf, 0xf9, 0x85, 0xe1, 0x5f, 0xad, 0xdd, 0x0f, 0x34, 0x06, 0x8e, 0x71,
0xb9, 0xb8, 0x28, 0xd2, 0xbf, 0x3e, 0x5f, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x47, 0x50, 0x7d, 0x60, 0x5d, 0x0a, 0x96, 0x3a, 0xaa, 0xa6, 0xe9, 0x5e, 0x75, 0x56, 0x41, 0xb4, 0xba, 0xfd, 0xdc,
0xc5, 0x5c, 0x12, 0x00, 0x00, 0xef, 0x33, 0xa3, 0x8b, 0x8b, 0x3c, 0xfd, 0x33, 0xea, 0x9b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff,
0x6e, 0x45, 0xe7, 0xe4, 0xf3, 0x12, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -40,13 +40,12 @@ message BuildOptions {
string NetworkMode = 15; string NetworkMode = 15;
repeated string NoCacheFilter = 16; repeated string NoCacheFilter = 16;
repeated string Platforms = 17; repeated string Platforms = 17;
bool Quiet = 18; repeated Secret Secrets = 18;
repeated Secret Secrets = 19; int64 ShmSize = 19;
int64 ShmSize = 20; repeated SSH SSH = 20;
repeated SSH SSH = 21; repeated string Tags = 21;
repeated string Tags = 22; string Target = 22;
string Target = 23; UlimitOpt Ulimits = 23;
UlimitOpt Ulimits = 24;
CommonOptions Opts = 25; CommonOptions Opts = 25;
} }
@ -95,7 +94,9 @@ message CommonOptions {
string Provenance = 8; // TODO string Provenance = 8; // TODO
} }
message BuildResponse {} message BuildResponse {
map<string, string> ExporterResponse = 1;
}
message DisconnectRequest { message DisconnectRequest {
string Ref = 1; string Ref = 1;

@ -91,18 +91,21 @@ func (c *Client) Invoke(ctx context.Context, ref string, containerConfig pb.Cont
}) })
} }
func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, error) { func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, *client.SolveResponse, error) {
ref := identity.NewID() ref := identity.NewID()
pw, err := progress.NewPrinter(context.TODO(), w, out, progressMode) pw, err := progress.NewPrinter(context.TODO(), w, out, progressMode)
if err != nil { if err != nil {
return "", err return "", nil, err
} }
statusChan := make(chan *client.SolveStatus) statusChan := make(chan *client.SolveStatus)
statusDone := make(chan struct{}) statusDone := make(chan struct{})
eg, egCtx := errgroup.WithContext(ctx) eg, egCtx := errgroup.WithContext(ctx)
var resp *client.SolveResponse
eg.Go(func() error { eg.Go(func() error {
defer close(statusChan) defer close(statusChan)
return c.build(egCtx, ref, options, in, statusChan) var err error
resp, err = c.build(egCtx, ref, options, in, statusChan)
return err
}) })
eg.Go(func() error { eg.Go(func() error {
defer close(statusDone) defer close(statusDone)
@ -116,20 +119,27 @@ func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadC
<-statusDone <-statusDone
return pw.Wait() return pw.Wait()
}) })
return ref, eg.Wait() return ref, resp, eg.Wait()
} }
func (c *Client) build(ctx context.Context, ref string, options pb.BuildOptions, in io.ReadCloser, statusChan chan *client.SolveStatus) error { func (c *Client) build(ctx context.Context, ref string, options pb.BuildOptions, in io.ReadCloser, statusChan chan *client.SolveStatus) (*client.SolveResponse, error) {
eg, egCtx := errgroup.WithContext(ctx) eg, egCtx := errgroup.WithContext(ctx)
done := make(chan struct{}) done := make(chan struct{})
var resp *client.SolveResponse
eg.Go(func() error { eg.Go(func() error {
defer close(done) defer close(done)
if _, err := c.client().Build(egCtx, &pb.BuildRequest{ pbResp, err := c.client().Build(egCtx, &pb.BuildRequest{
Ref: ref, Ref: ref,
Options: &options, Options: &options,
}); err != nil { })
if err != nil {
return err return err
} }
resp = &client.SolveResponse{
ExporterResponse: pbResp.ExporterResponse,
}
return nil return nil
}) })
eg.Go(func() error { eg.Go(func() error {
@ -254,7 +264,7 @@ func (c *Client) build(ctx context.Context, ref string, options pb.BuildOptions,
return eg2.Wait() return eg2.Wait()
}) })
} }
return eg.Wait() return resp, eg.Wait()
} }
func (c *Client) client() pb.ControllerClient { func (c *Client) client() pb.ControllerClient {

@ -141,7 +141,7 @@ func serveCmd(dockerCli command.Cli) *cobra.Command {
}() }()
// prepare server // prepare server
b := NewServer(func(ctx context.Context, options *controllerapi.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (res *build.ResultContext, err error) { b := NewServer(func(ctx context.Context, options *controllerapi.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (*client.SolveResponse, *build.ResultContext, error) {
return cbuild.RunBuild(ctx, dockerCli, *options, stdin, "quiet", statusChan) return cbuild.RunBuild(ctx, dockerCli, *options, stdin, "quiet", statusChan)
}) })
defer b.Close() defer b.Close()

@ -17,7 +17,7 @@ import (
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
) )
type BuildFunc func(ctx context.Context, options *pb.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (res *build.ResultContext, err error) type BuildFunc func(ctx context.Context, options *pb.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (resp *client.SolveResponse, res *build.ResultContext, err error)
func NewServer(buildFunc BuildFunc) *Server { func NewServer(buildFunc BuildFunc) *Server {
return &Server{ return &Server{
@ -150,7 +150,7 @@ func (m *Server) Build(ctx context.Context, req *pb.BuildRequest) (*pb.BuildResp
// Build the specified request // Build the specified request
ctx, cancel := context.WithCancel(ctx) ctx, cancel := context.WithCancel(ctx)
defer cancel() defer cancel()
res, err := m.buildFunc(ctx, req.Options, inR, statusChan) resp, res, err := m.buildFunc(ctx, req.Options, inR, statusChan)
m.sessionMu.Lock() m.sessionMu.Lock()
if s, ok := m.session[ref]; ok { if s, ok := m.session[ref]; ok {
s.result = res s.result = res
@ -162,7 +162,12 @@ func (m *Server) Build(ctx context.Context, req *pb.BuildRequest) (*pb.BuildResp
} }
m.sessionMu.Unlock() m.sessionMu.Unlock()
return &pb.BuildResponse{}, err if resp == nil {
resp = &client.SolveResponse{}
}
return &pb.BuildResponse{
ExporterResponse: resp.ExporterResponse,
}, err
} }
func (m *Server) Status(req *pb.StatusRequest, stream pb.Controller_StatusServer) error { func (m *Server) Status(req *pb.StatusRequest, stream pb.Controller_StatusServer) error {

@ -121,7 +121,7 @@ func RunMonitor(ctx context.Context, curRef string, options controllerapi.BuildO
fmt.Println("disconnect error", err) fmt.Println("disconnect error", err)
} }
} }
ref, err := c.Build(ctx, options, nil, stdout, stderr, progressMode) // TODO: support stdin, hold build ref ref, _, err := c.Build(ctx, options, nil, stdout, stderr, progressMode) // TODO: support stdin, hold build ref
if err != nil { if err != nil {
fmt.Printf("failed to reload: %v\n", err) fmt.Printf("failed to reload: %v\n", err)
} else { } else {

Loading…
Cancel
Save