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)
var dtDockerfile []byte
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 {
return err
}
@ -84,7 +86,9 @@ func Build(ctx context.Context, c client.Client) error {
if err != nil {
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 {
return err
}
@ -131,7 +135,10 @@ func Build(ctx context.Context, c client.Client) error {
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,
}, true)
if err != nil {

View File

@ -8,7 +8,6 @@ import (
"github.com/moby/buildkit/frontend/gateway/client"
"github.com/moby/buildkit/session"
solver "github.com/moby/buildkit/solver-next"
"github.com/moby/buildkit/solver/pb"
"github.com/moby/buildkit/worker"
"github.com/pkg/errors"
)
@ -26,11 +25,12 @@ type bridgeClient struct {
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{
Definition: def,
Frontend: f,
ImportCacheRefs: cacheImportRefs,
Definition: req.Definition,
Frontend: req.Frontend,
FrontendOpt: req.FrontendOpt,
ImportCacheRefs: req.ImportCacheRefs,
})
if err != nil {
return nil, err

View File

@ -9,7 +9,7 @@ import (
// TODO: make this take same options as LLBBridge. Add Return()
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)
Opts() map[string]string
SessionID() string
@ -18,3 +18,11 @@ type Client interface {
type Reference interface {
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) {
ctx = tracing.ContextWithSpanFromContext(ctx, lbf.callCtx)
ref, expResp, err := lbf.llbBridge.Solve(ctx, frontend.SolveRequest{
Definition: req.Definition,
Frontend: req.Frontend,
Definition: req.Definition,
Frontend: req.Frontend,
FrontendOpt: req.FrontendOpt,
ImportCacheRefs: req.ImportCacheRefs,
})
if err != nil {
return nil, err

View File

@ -11,7 +11,6 @@ import (
"github.com/moby/buildkit/frontend/gateway/client"
pb "github.com/moby/buildkit/frontend/gateway/pb"
opspb "github.com/moby/buildkit/solver/pb"
digest "github.com/opencontainers/go-digest"
"github.com/pkg/errors"
"google.golang.org/grpc"
@ -41,12 +40,19 @@ type grpcClient struct {
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)
if err != nil {
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)
if err != nil {
return nil, err

View File

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