gateway: update gateway to cache import refs

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
docker-18.09
Tonis Tiigi 2018-04-27 15:47:32 -07:00
parent 966d3f7b32
commit 644540e0f1
7 changed files with 290 additions and 51 deletions

View File

@ -58,7 +58,9 @@ func Build(ctx context.Context, c client.Client) error {
eg, ctx2 := errgroup.WithContext(ctx) eg, ctx2 := errgroup.WithContext(ctx)
var dtDockerfile []byte var dtDockerfile []byte
eg.Go(func() error { eg.Go(func() error {
ref, err := c.Solve(ctx2, def.ToPB(), "", nil, nil, false) ref, err := c.Solve(ctx2, client.SolveRequest{
Definition: def.ToPB(),
}, nil, false)
if err != nil { if err != nil {
return err return err
} }
@ -84,7 +86,9 @@ func Build(ctx context.Context, c client.Client) error {
if err != nil { if err != nil {
return err return err
} }
ref, err := c.Solve(ctx2, def.ToPB(), "", nil, nil, false) ref, err := c.Solve(ctx2, client.SolveRequest{
Definition: def.ToPB(),
}, nil, false)
if err != nil { if err != nil {
return err return err
} }
@ -131,7 +135,10 @@ func Build(ctx context.Context, c client.Client) error {
cacheFrom = strings.Split(cacheFromStr, ",") cacheFrom = strings.Split(cacheFromStr, ",")
} }
_, err = c.Solve(ctx, def.ToPB(), "", cacheFrom, map[string][]byte{ _, err = c.Solve(ctx, client.SolveRequest{
Definition: def.ToPB(),
ImportCacheRefs: cacheFrom,
}, map[string][]byte{
exporterImageConfig: config, exporterImageConfig: config,
}, true) }, true)
if err != nil { if err != nil {

View File

@ -8,7 +8,6 @@ import (
"github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/frontend/gateway/client"
"github.com/moby/buildkit/session" "github.com/moby/buildkit/session"
solver "github.com/moby/buildkit/solver-next" solver "github.com/moby/buildkit/solver-next"
"github.com/moby/buildkit/solver/pb"
"github.com/moby/buildkit/worker" "github.com/moby/buildkit/worker"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -26,11 +25,12 @@ type bridgeClient struct {
refs []*ref refs []*ref
} }
func (c *bridgeClient) Solve(ctx context.Context, def *pb.Definition, f string, cacheImportRefs []string, exporterAttr map[string][]byte, final bool) (client.Reference, error) { func (c *bridgeClient) Solve(ctx context.Context, req client.SolveRequest, exporterAttr map[string][]byte, final bool) (client.Reference, error) {
r, exporterAttrRes, err := c.FrontendLLBBridge.Solve(ctx, frontend.SolveRequest{ r, exporterAttrRes, err := c.FrontendLLBBridge.Solve(ctx, frontend.SolveRequest{
Definition: def, Definition: req.Definition,
Frontend: f, Frontend: req.Frontend,
ImportCacheRefs: cacheImportRefs, FrontendOpt: req.FrontendOpt,
ImportCacheRefs: req.ImportCacheRefs,
}) })
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -9,7 +9,7 @@ import (
// TODO: make this take same options as LLBBridge. Add Return() // TODO: make this take same options as LLBBridge. Add Return()
type Client interface { type Client interface {
Solve(ctx context.Context, def *pb.Definition, frontend string, cacheImportRefs []string, exporterAttr map[string][]byte, final bool) (Reference, error) Solve(ctx context.Context, req SolveRequest, exporterAttr map[string][]byte, final bool) (Reference, error)
ResolveImageConfig(ctx context.Context, ref string) (digest.Digest, []byte, error) ResolveImageConfig(ctx context.Context, ref string) (digest.Digest, []byte, error)
Opts() map[string]string Opts() map[string]string
SessionID() string SessionID() string
@ -18,3 +18,11 @@ type Client interface {
type Reference interface { type Reference interface {
ReadFile(ctx context.Context, fp string) ([]byte, error) ReadFile(ctx context.Context, fp string) ([]byte, error)
} }
// SolveRequest is same as frontend.SolveRequest but avoiding dependency
type SolveRequest struct {
Definition *pb.Definition
Frontend string
FrontendOpt map[string]string
ImportCacheRefs []string
}

View File

@ -271,8 +271,10 @@ func (lbf *llbBridgeForwarder) ResolveImageConfig(ctx context.Context, req *pb.R
func (lbf *llbBridgeForwarder) Solve(ctx context.Context, req *pb.SolveRequest) (*pb.SolveResponse, error) { func (lbf *llbBridgeForwarder) Solve(ctx context.Context, req *pb.SolveRequest) (*pb.SolveResponse, error) {
ctx = tracing.ContextWithSpanFromContext(ctx, lbf.callCtx) ctx = tracing.ContextWithSpanFromContext(ctx, lbf.callCtx)
ref, expResp, err := lbf.llbBridge.Solve(ctx, frontend.SolveRequest{ ref, expResp, err := lbf.llbBridge.Solve(ctx, frontend.SolveRequest{
Definition: req.Definition, Definition: req.Definition,
Frontend: req.Frontend, Frontend: req.Frontend,
FrontendOpt: req.FrontendOpt,
ImportCacheRefs: req.ImportCacheRefs,
}) })
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -11,7 +11,6 @@ import (
"github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/frontend/gateway/client"
pb "github.com/moby/buildkit/frontend/gateway/pb" pb "github.com/moby/buildkit/frontend/gateway/pb"
opspb "github.com/moby/buildkit/solver/pb"
digest "github.com/opencontainers/go-digest" digest "github.com/opencontainers/go-digest"
"github.com/pkg/errors" "github.com/pkg/errors"
"google.golang.org/grpc" "google.golang.org/grpc"
@ -41,12 +40,19 @@ type grpcClient struct {
sessionID string sessionID string
} }
func (c *grpcClient) Solve(ctx context.Context, def *opspb.Definition, frontend string, exporterAttr map[string][]byte, final bool) (client.Reference, error) { func (c *grpcClient) Solve(ctx context.Context, creq client.SolveRequest, exporterAttr map[string][]byte, final bool) (client.Reference, error) {
dt, err := json.Marshal(exporterAttr) dt, err := json.Marshal(exporterAttr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
req := &pb.SolveRequest{Definition: def, Frontend: frontend, Final: final, ExporterAttr: dt} req := &pb.SolveRequest{
Definition: creq.Definition,
Frontend: creq.Frontend,
FrontendOpt: creq.FrontendOpt,
ImportCacheRefs: creq.ImportCacheRefs,
Final: final,
ExporterAttr: dt,
}
resp, err := c.client.Solve(ctx, req) resp, err := c.client.Solve(ctx, req)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -79,10 +79,12 @@ func (m *ResolveImageConfigResponse) GetConfig() []byte {
} }
type SolveRequest struct { type SolveRequest struct {
Definition *pb.Definition `protobuf:"bytes,1,opt,name=Definition" json:"Definition,omitempty"` Definition *pb.Definition `protobuf:"bytes,1,opt,name=Definition" json:"Definition,omitempty"`
Frontend string `protobuf:"bytes,2,opt,name=Frontend,proto3" json:"Frontend,omitempty"` Frontend string `protobuf:"bytes,2,opt,name=Frontend,proto3" json:"Frontend,omitempty"`
Final bool `protobuf:"varint,10,opt,name=Final,proto3" json:"Final,omitempty"` FrontendOpt map[string]string `protobuf:"bytes,3,rep,name=FrontendOpt" json:"FrontendOpt,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
ExporterAttr []byte `protobuf:"bytes,11,opt,name=ExporterAttr,proto3" json:"ExporterAttr,omitempty"` ImportCacheRefs []string `protobuf:"bytes,4,rep,name=ImportCacheRefs" json:"ImportCacheRefs,omitempty"`
Final bool `protobuf:"varint,10,opt,name=Final,proto3" json:"Final,omitempty"`
ExporterAttr []byte `protobuf:"bytes,11,opt,name=ExporterAttr,proto3" json:"ExporterAttr,omitempty"`
} }
func (m *SolveRequest) Reset() { *m = SolveRequest{} } func (m *SolveRequest) Reset() { *m = SolveRequest{} }
@ -104,6 +106,20 @@ func (m *SolveRequest) GetFrontend() string {
return "" return ""
} }
func (m *SolveRequest) GetFrontendOpt() map[string]string {
if m != nil {
return m.FrontendOpt
}
return nil
}
func (m *SolveRequest) GetImportCacheRefs() []string {
if m != nil {
return m.ImportCacheRefs
}
return nil
}
func (m *SolveRequest) GetFinal() bool { func (m *SolveRequest) GetFinal() bool {
if m != nil { if m != nil {
return m.Final return m.Final
@ -465,6 +481,38 @@ func (m *SolveRequest) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintGateway(dAtA, i, uint64(len(m.Frontend))) i = encodeVarintGateway(dAtA, i, uint64(len(m.Frontend)))
i += copy(dAtA[i:], m.Frontend) i += copy(dAtA[i:], m.Frontend)
} }
if len(m.FrontendOpt) > 0 {
for k, _ := range m.FrontendOpt {
dAtA[i] = 0x1a
i++
v := m.FrontendOpt[k]
mapSize := 1 + len(k) + sovGateway(uint64(len(k))) + 1 + len(v) + sovGateway(uint64(len(v)))
i = encodeVarintGateway(dAtA, i, uint64(mapSize))
dAtA[i] = 0xa
i++
i = encodeVarintGateway(dAtA, i, uint64(len(k)))
i += copy(dAtA[i:], k)
dAtA[i] = 0x12
i++
i = encodeVarintGateway(dAtA, i, uint64(len(v)))
i += copy(dAtA[i:], v)
}
}
if len(m.ImportCacheRefs) > 0 {
for _, s := range m.ImportCacheRefs {
dAtA[i] = 0x22
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
if m.Final { if m.Final {
dAtA[i] = 0x50 dAtA[i] = 0x50
i++ i++
@ -648,6 +696,20 @@ func (m *SolveRequest) Size() (n int) {
if l > 0 { if l > 0 {
n += 1 + l + sovGateway(uint64(l)) n += 1 + l + sovGateway(uint64(l))
} }
if len(m.FrontendOpt) > 0 {
for k, v := range m.FrontendOpt {
_ = k
_ = v
mapEntrySize := 1 + len(k) + sovGateway(uint64(len(k))) + 1 + len(v) + sovGateway(uint64(len(v)))
n += mapEntrySize + 1 + sovGateway(uint64(mapEntrySize))
}
}
if len(m.ImportCacheRefs) > 0 {
for _, s := range m.ImportCacheRefs {
l = len(s)
n += 1 + l + sovGateway(uint64(l))
}
}
if m.Final { if m.Final {
n += 2 n += 2
} }
@ -1001,6 +1063,153 @@ func (m *SolveRequest) Unmarshal(dAtA []byte) error {
} }
m.Frontend = string(dAtA[iNdEx:postIndex]) m.Frontend = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field FrontendOpt", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGateway
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.FrontendOpt == nil {
m.FrontendOpt = make(map[string]string)
}
var mapkey string
var mapvalue string
for iNdEx < postIndex {
entryPreIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
if fieldNum == 1 {
var stringLenmapkey uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLenmapkey |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLenmapkey := int(stringLenmapkey)
if intStringLenmapkey < 0 {
return ErrInvalidLengthGateway
}
postStringIndexmapkey := iNdEx + intStringLenmapkey
if postStringIndexmapkey > l {
return io.ErrUnexpectedEOF
}
mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
iNdEx = postStringIndexmapkey
} else if fieldNum == 2 {
var stringLenmapvalue uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLenmapvalue |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLenmapvalue := int(stringLenmapvalue)
if intStringLenmapvalue < 0 {
return ErrInvalidLengthGateway
}
postStringIndexmapvalue := iNdEx + intStringLenmapvalue
if postStringIndexmapvalue > l {
return io.ErrUnexpectedEOF
}
mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
iNdEx = postStringIndexmapvalue
} else {
iNdEx = entryPreIndex
skippy, err := skipGateway(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthGateway
}
if (iNdEx + skippy) > postIndex {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
m.FrontendOpt[mapkey] = mapvalue
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ImportCacheRefs", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGateway
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ImportCacheRefs = append(m.ImportCacheRefs, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
case 10: case 10:
if wireType != 0 { if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Final", wireType) return fmt.Errorf("proto: wrong wireType = %d for field Final", wireType)
@ -1580,37 +1789,42 @@ var (
func init() { proto.RegisterFile("gateway.proto", fileDescriptorGateway) } func init() { proto.RegisterFile("gateway.proto", fileDescriptorGateway) }
var fileDescriptorGateway = []byte{ var fileDescriptorGateway = []byte{
// 502 bytes of a gzipped FileDescriptorProto // 582 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcb, 0x6e, 0xd3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4d, 0x6f, 0xd3, 0x40,
0x14, 0x65, 0xfa, 0x88, 0x92, 0x1b, 0xa7, 0x54, 0x23, 0x84, 0x52, 0x2f, 0xd2, 0xc8, 0x8b, 0x12, 0x10, 0xc5, 0x49, 0x5b, 0x35, 0x13, 0xf7, 0x43, 0x2b, 0x84, 0x5c, 0x1f, 0xda, 0xc8, 0x87, 0x62,
0x15, 0x32, 0x16, 0x01, 0xd6, 0x88, 0x90, 0x46, 0x02, 0x75, 0x11, 0x0d, 0x0b, 0x24, 0x76, 0x76, 0x15, 0xba, 0x16, 0x01, 0xa4, 0x8a, 0x03, 0x88, 0xb4, 0x89, 0x54, 0x54, 0x89, 0x68, 0x39, 0x20,
0x3c, 0x9e, 0x8e, 0x70, 0x66, 0x8c, 0x3d, 0x29, 0x74, 0x07, 0xff, 0xc0, 0x4f, 0xf0, 0x27, 0x5d, 0xf5, 0x66, 0x27, 0x6b, 0x67, 0x15, 0x67, 0xd7, 0xd8, 0x9b, 0x40, 0x6e, 0xf0, 0x73, 0xf8, 0x27,
0xb2, 0x66, 0x51, 0xa1, 0x7c, 0x09, 0xca, 0x78, 0x92, 0xba, 0xca, 0x03, 0xd8, 0xcd, 0x1d, 0xdf, 0x3d, 0x72, 0xee, 0xa1, 0x42, 0xf9, 0x25, 0xc8, 0x6b, 0x3b, 0x75, 0x1b, 0x12, 0xca, 0x6d, 0x67,
0x73, 0xe6, 0xdc, 0x73, 0xae, 0xa1, 0xc1, 0x03, 0xcd, 0x3e, 0x07, 0x57, 0x24, 0xcd, 0x94, 0x56, 0xf3, 0xde, 0xdb, 0x37, 0xf3, 0x26, 0x86, 0xad, 0xc0, 0x95, 0xf4, 0xab, 0x3b, 0xc5, 0x51, 0x2c,
0xf8, 0x68, 0xa2, 0xc2, 0x2b, 0x12, 0x4e, 0x45, 0x12, 0x7d, 0x14, 0x9a, 0x5c, 0x3e, 0x25, 0x71, 0xa4, 0x40, 0x7b, 0x23, 0xe1, 0x4d, 0xb1, 0x37, 0x66, 0x61, 0x7f, 0xc8, 0x24, 0x9e, 0xbc, 0xc0,
0xa6, 0xa4, 0x66, 0x32, 0x72, 0xbb, 0x5c, 0xe8, 0x8b, 0x69, 0x48, 0xc6, 0x6a, 0xe2, 0x73, 0xc5, 0x7e, 0x2c, 0xb8, 0xa4, 0xbc, 0x6f, 0x1e, 0x07, 0x4c, 0x0e, 0xc6, 0x1e, 0xee, 0x89, 0x91, 0x13,
0x95, 0x6f, 0x10, 0xe1, 0x34, 0x36, 0x95, 0x29, 0xcc, 0xa9, 0x60, 0x72, 0x9f, 0x94, 0xda, 0xe7, 0x88, 0x40, 0x38, 0x8a, 0xe1, 0x8d, 0x7d, 0x55, 0xa9, 0x42, 0x9d, 0x32, 0x25, 0xf3, 0x79, 0x09,
0xa4, 0xfe, 0x82, 0xd4, 0xcf, 0x55, 0x72, 0xc9, 0x32, 0x3f, 0x0d, 0x7d, 0x95, 0xe6, 0x45, 0xb7, 0x9e, 0x8a, 0x3a, 0x85, 0xa8, 0x93, 0x88, 0x70, 0x42, 0x63, 0x27, 0xf2, 0x1c, 0x11, 0x25, 0x19,
0xd7, 0x85, 0x23, 0xca, 0xcc, 0x87, 0x37, 0x93, 0x80, 0xb3, 0xd7, 0x4a, 0xc6, 0x82, 0x53, 0xf6, 0xda, 0x3a, 0x86, 0x3d, 0x42, 0xd5, 0x0f, 0xe7, 0x23, 0x37, 0xa0, 0xa7, 0x82, 0xfb, 0x2c, 0x20,
0x69, 0xca, 0x72, 0x8d, 0x0f, 0x61, 0x97, 0xb2, 0xb8, 0x89, 0xda, 0xa8, 0x53, 0xa3, 0xf3, 0xa3, 0xf4, 0xcb, 0x98, 0x26, 0x12, 0xed, 0x42, 0x95, 0x50, 0xdf, 0xd0, 0x1a, 0x9a, 0x5d, 0x23, 0xe9,
0xf7, 0x15, 0x81, 0xbb, 0xae, 0x3f, 0x4f, 0x95, 0xcc, 0x19, 0x7e, 0x0b, 0x95, 0x81, 0xe0, 0x2c, 0xd1, 0xfa, 0xae, 0x81, 0xf9, 0x37, 0x7c, 0x12, 0x09, 0x9e, 0x50, 0xf4, 0x01, 0x36, 0xce, 0x58,
0xd7, 0x05, 0xa6, 0xdf, 0xbb, 0xbe, 0x39, 0xbe, 0xf7, 0xeb, 0xe6, 0xf8, 0xb4, 0xa4, 0x49, 0xa5, 0x40, 0x13, 0x99, 0x71, 0x5a, 0xcd, 0xab, 0x9b, 0x83, 0x47, 0xd7, 0x37, 0x07, 0x47, 0x25, 0x4f,
0x4c, 0x8e, 0x95, 0xd4, 0x81, 0x90, 0x2c, 0xcb, 0x7d, 0xae, 0xba, 0x91, 0x81, 0x90, 0x02, 0x49, 0x22, 0xa2, 0xbc, 0x27, 0xb8, 0x74, 0x19, 0xa7, 0x71, 0xe2, 0x04, 0xe2, 0xb8, 0xaf, 0x28, 0x38,
0x2d, 0x03, 0x7e, 0x08, 0x95, 0x82, 0xbd, 0xb9, 0xd3, 0x46, 0x1d, 0x87, 0xda, 0xca, 0xfb, 0x8e, 0x63, 0x92, 0x5c, 0x01, 0x3d, 0x81, 0x8d, 0x4c, 0xdd, 0xa8, 0x34, 0x34, 0x5b, 0x27, 0x79, 0x65,
0xc0, 0x79, 0x37, 0x17, 0xb0, 0x50, 0x49, 0x00, 0x06, 0x2c, 0x16, 0x52, 0x68, 0xa1, 0xa4, 0x79, 0x5d, 0x57, 0x40, 0xff, 0x94, 0x1a, 0x28, 0x5c, 0x62, 0x80, 0x33, 0xea, 0x33, 0xce, 0x24, 0x13,
0xb8, 0xde, 0x3b, 0x20, 0x69, 0x48, 0x6e, 0x6f, 0x69, 0xa9, 0x03, 0xbb, 0x50, 0x1d, 0x5a, 0x6f, 0x5c, 0x3d, 0x5c, 0x6f, 0x6e, 0xe3, 0xc8, 0xc3, 0xb7, 0xb7, 0xa4, 0x84, 0x40, 0x26, 0x6c, 0x76,
0x0d, 0x75, 0x8d, 0x2e, 0x6b, 0xfc, 0x00, 0xf6, 0x87, 0x42, 0x06, 0x49, 0x13, 0xda, 0xa8, 0x53, 0xf2, 0xd9, 0x2a, 0xe9, 0x1a, 0x99, 0xd7, 0xe8, 0x12, 0xea, 0xc5, 0xf9, 0x63, 0x24, 0x8d, 0x6a,
0xa5, 0x45, 0x81, 0x3d, 0x70, 0xce, 0xbe, 0xa4, 0x2a, 0xd3, 0x2c, 0x7b, 0xa5, 0x75, 0xd6, 0xac, 0xa3, 0x6a, 0xd7, 0x9b, 0x27, 0x78, 0x69, 0x38, 0xb8, 0xec, 0x04, 0x97, 0xa8, 0x6d, 0x2e, 0xe3,
0x1b, 0x41, 0x77, 0xee, 0xbc, 0x33, 0x68, 0x58, 0x55, 0xd6, 0x8b, 0x15, 0xf3, 0x56, 0x68, 0x76, 0x29, 0x29, 0x8b, 0x21, 0x1b, 0x76, 0xce, 0x47, 0x91, 0x88, 0xe5, 0xa9, 0xdb, 0x1b, 0x50, 0x42,
0xd6, 0xd0, 0xbc, 0x84, 0xfb, 0x94, 0x05, 0xd1, 0x50, 0x24, 0x6c, 0x63, 0x0a, 0x66, 0x02, 0x91, 0xfd, 0xc4, 0x58, 0x6b, 0x54, 0xed, 0x1a, 0xb9, 0x7f, 0x8d, 0x1e, 0xc3, 0x7a, 0x87, 0x71, 0x37,
0xb0, 0x51, 0xa0, 0x2f, 0x96, 0x13, 0xd8, 0xda, 0x3b, 0x81, 0xc3, 0x5b, 0x02, 0x2b, 0x05, 0xc3, 0x34, 0xa0, 0xa1, 0xd9, 0x9b, 0x24, 0x2b, 0x90, 0x05, 0x7a, 0xfb, 0x5b, 0x0a, 0xa4, 0xf1, 0x7b,
0xde, 0x20, 0xd0, 0x81, 0xa1, 0x70, 0xa8, 0x39, 0x7b, 0x0d, 0xa8, 0x8f, 0x84, 0x5c, 0x44, 0xed, 0x29, 0x63, 0xa3, 0xae, 0xc6, 0x72, 0xe7, 0xce, 0x7c, 0x0b, 0xbb, 0xf7, 0x4d, 0xa4, 0x29, 0x0e,
0x1d, 0x80, 0x33, 0x52, 0x72, 0x99, 0x64, 0xef, 0xc7, 0x2e, 0xd4, 0xce, 0xcf, 0xfb, 0xfd, 0x4c, 0xe9, 0xb4, 0x48, 0x71, 0x48, 0xa7, 0xa9, 0xfe, 0xc4, 0x0d, 0xc7, 0x34, 0x6f, 0x3f, 0x2b, 0xde,
0x44, 0x9c, 0xe1, 0x6f, 0x08, 0xf0, 0x6a, 0xec, 0xf8, 0x39, 0xd9, 0xb8, 0xb5, 0x64, 0xe3, 0x56, 0x54, 0x4e, 0x34, 0xab, 0x0d, 0x5b, 0x79, 0x47, 0x79, 0xa2, 0x0b, 0x2b, 0xb0, 0x60, 0xa3, 0xb2,
0xb9, 0x2f, 0xfe, 0x13, 0x65, 0x87, 0xf8, 0x00, 0xfb, 0xc6, 0x60, 0xfc, 0x68, 0x0b, 0xbe, 0xbc, 0x68, 0xc3, 0x7a, 0x07, 0x3b, 0x84, 0xba, 0xfd, 0x0e, 0x0b, 0xe9, 0xd2, 0x5d, 0x52, 0x39, 0xb0,
0x18, 0x6e, 0xe7, 0xef, 0x8d, 0x96, 0x7b, 0x0c, 0xd5, 0x85, 0x69, 0xf8, 0x74, 0xab, 0xbc, 0x3b, 0x90, 0x76, 0x5d, 0x39, 0x98, 0xe7, 0x90, 0xd7, 0xd6, 0x21, 0xec, 0xde, 0x0a, 0xe4, 0x56, 0x10,
0xd1, 0xb8, 0x8f, 0xff, 0xa9, 0xd7, 0x3e, 0xf2, 0x1e, 0xf6, 0xe6, 0x8e, 0xe3, 0x93, 0x2d, 0xa0, 0xac, 0x9d, 0xb9, 0xd2, 0x55, 0x12, 0x3a, 0x51, 0x67, 0x6b, 0x0b, 0xea, 0x5d, 0xc6, 0x8b, 0x85,
0x52, 0x24, 0xee, 0xb6, 0x39, 0xcb, 0x59, 0xf5, 0x9d, 0xeb, 0x59, 0x0b, 0xfd, 0x9c, 0xb5, 0xd0, 0xb5, 0xb6, 0x41, 0xef, 0x0a, 0x3e, 0xdf, 0xc7, 0xe6, 0xcf, 0x2a, 0xd4, 0x2e, 0x2e, 0x5a, 0xad,
0xef, 0x59, 0x0b, 0x85, 0x15, 0xf3, 0x63, 0x3f, 0xfb, 0x13, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x43, 0x98, 0xf5, 0x03, 0x8a, 0x7e, 0x68, 0x80, 0x16, 0x97, 0x17, 0xbd, 0x5a, 0x11, 0xef, 0xd2, 0xff,
0xcd, 0x20, 0x61, 0x04, 0x00, 0x00, 0x86, 0xf9, 0xfa, 0x3f, 0x59, 0x79, 0x13, 0x97, 0xb0, 0xae, 0x06, 0x8c, 0x9e, 0x3e, 0x70, 0xa9,
0x4c, 0xfb, 0xdf, 0xc0, 0x5c, 0xbb, 0x07, 0x9b, 0xc5, 0xd0, 0xd0, 0xd1, 0x4a, 0x7b, 0x77, 0xa2,
0x31, 0x9f, 0x3d, 0x08, 0x9b, 0x3f, 0xf2, 0x19, 0xd6, 0xd2, 0x89, 0xa3, 0xc3, 0x15, 0xa4, 0x52,
0x24, 0xe6, 0xaa, 0x3e, 0xcb, 0x59, 0xb5, 0xf4, 0xab, 0xd9, 0xbe, 0xf6, 0x6b, 0xb6, 0xaf, 0xfd,
0x9e, 0xed, 0x6b, 0xde, 0x86, 0xfa, 0x3c, 0xbd, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0xa5, 0xe5,
0xee, 0xf6, 0x27, 0x05, 0x00, 0x00,
} }

View File

@ -28,6 +28,8 @@ message ResolveImageConfigResponse {
message SolveRequest { message SolveRequest {
pb.Definition Definition = 1; pb.Definition Definition = 1;
string Frontend = 2; string Frontend = 2;
map<string, string> FrontendOpt = 3;
repeated string ImportCacheRefs = 4;
bool Final = 10; bool Final = 10;
bytes ExporterAttr = 11; bytes ExporterAttr = 11;
} }