From 9f5e5c7dc76f227068cc93784800c73e58c92e19 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Tue, 24 Jul 2018 23:18:21 -0700 Subject: [PATCH] metaresolver: refactor to option struct and resolvemode Signed-off-by: Tonis Tiigi --- client/llb/imagemetaresolver/resolver.go | 4 +- client/llb/resolver.go | 4 +- client/llb/source.go | 6 +- frontend/dockerfile/dockerfile2llb/convert.go | 5 +- frontend/frontend.go | 7 +- frontend/gateway/client/client.go | 8 +- frontend/gateway/gateway.go | 8 +- frontend/gateway/grpcclient/client.go | 7 +- frontend/gateway/pb/caps.go | 20 ++- frontend/gateway/pb/gateway.pb.go | 148 ++++++++++++------ frontend/gateway/pb/gateway.proto | 2 + solver/llbsolver/bridge.go | 5 +- source/containerimage/pull.go | 13 +- source/identifier.go | 27 ++-- worker/base/worker.go | 7 +- worker/worker.go | 3 +- 16 files changed, 184 insertions(+), 90 deletions(-) diff --git a/client/llb/imagemetaresolver/resolver.go b/client/llb/imagemetaresolver/resolver.go index 98b5a57a..e13a5780 100644 --- a/client/llb/imagemetaresolver/resolver.go +++ b/client/llb/imagemetaresolver/resolver.go @@ -10,6 +10,7 @@ import ( "github.com/containerd/containerd/remotes/docker" "github.com/docker/docker/pkg/locker" "github.com/moby/buildkit/client/llb" + gw "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/util/contentutil" "github.com/moby/buildkit/util/imageutil" digest "github.com/opencontainers/go-digest" @@ -71,10 +72,11 @@ type resolveResult struct { dgst digest.Digest } -func (imr *imageMetaResolver) ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) { +func (imr *imageMetaResolver) ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) { imr.locker.Lock(ref) defer imr.locker.Unlock(ref) + platform := opt.Platform if platform == nil { platform = imr.platform } diff --git a/client/llb/resolver.go b/client/llb/resolver.go index 9e45e03e..45240f02 100644 --- a/client/llb/resolver.go +++ b/client/llb/resolver.go @@ -3,8 +3,8 @@ package llb import ( "context" + gw "github.com/moby/buildkit/frontend/gateway/client" digest "github.com/opencontainers/go-digest" - specs "github.com/opencontainers/image-spec/specs-go/v1" ) func WithMetaResolver(mr ImageMetaResolver) ImageOption { @@ -14,5 +14,5 @@ func WithMetaResolver(mr ImageMetaResolver) ImageOption { } type ImageMetaResolver interface { - ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) + ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) } diff --git a/client/llb/source.go b/client/llb/source.go index 1e4c4b1f..058c25f6 100644 --- a/client/llb/source.go +++ b/client/llb/source.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/docker/distribution/reference" + gw "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/solver/pb" "github.com/moby/buildkit/util/apicaps" digest "github.com/opencontainers/go-digest" @@ -114,7 +115,10 @@ func Image(ref string, opts ...ImageOption) State { src.err = err } if info.metaResolver != nil { - _, dt, err := info.metaResolver.ResolveImageConfig(context.TODO(), ref, info.Constraints.Platform) + _, dt, err := info.metaResolver.ResolveImageConfig(context.TODO(), ref, gw.ResolveImageConfigOpt{ + Platform: info.Constraints.Platform, + ResolveMode: info.resolveMode.String(), + }) if err != nil { src.err = err } else { diff --git a/frontend/dockerfile/dockerfile2llb/convert.go b/frontend/dockerfile/dockerfile2llb/convert.go index 288f0d9a..961e254a 100644 --- a/frontend/dockerfile/dockerfile2llb/convert.go +++ b/frontend/dockerfile/dockerfile2llb/convert.go @@ -21,6 +21,7 @@ import ( "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/moby/buildkit/frontend/dockerfile/parser" "github.com/moby/buildkit/frontend/dockerfile/shell" + gw "github.com/moby/buildkit/frontend/gateway/client" specs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" "golang.org/x/sync/errgroup" @@ -186,7 +187,9 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State, d.stage.BaseName = reference.TagNameOnly(ref).String() var isScratch bool if metaResolver != nil && reachable { - dgst, dt, err := metaResolver.ResolveImageConfig(ctx, d.stage.BaseName, platform) + dgst, dt, err := metaResolver.ResolveImageConfig(ctx, d.stage.BaseName, gw.ResolveImageConfigOpt{ + Platform: platform, + }) if err == nil { // handle the error while builder is actually running var img Image if err := json.Unmarshal(dt, &img); err != nil { diff --git a/frontend/frontend.go b/frontend/frontend.go index 5bae3d26..26b861f8 100644 --- a/frontend/frontend.go +++ b/frontend/frontend.go @@ -7,9 +7,8 @@ import ( "github.com/moby/buildkit/cache" "github.com/moby/buildkit/client" "github.com/moby/buildkit/executor" - gatewayclient "github.com/moby/buildkit/frontend/gateway/client" + gw "github.com/moby/buildkit/frontend/gateway/client" digest "github.com/opencontainers/go-digest" - specs "github.com/opencontainers/image-spec/specs-go/v1" ) type Frontend interface { @@ -18,11 +17,11 @@ type Frontend interface { type FrontendLLBBridge interface { Solve(ctx context.Context, req SolveRequest) (*Result, error) - ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) + ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) Exec(ctx context.Context, meta executor.Meta, rootfs cache.ImmutableRef, stdin io.ReadCloser, stdout, stderr io.WriteCloser) error } -type SolveRequest = gatewayclient.SolveRequest +type SolveRequest = gw.SolveRequest type WorkerInfos interface { WorkerInfos() []client.WorkerInfo diff --git a/frontend/gateway/client/client.go b/frontend/gateway/client/client.go index 2198a56b..48c5fca2 100644 --- a/frontend/gateway/client/client.go +++ b/frontend/gateway/client/client.go @@ -10,7 +10,7 @@ import ( type Client interface { Solve(ctx context.Context, req SolveRequest) (*Result, error) - ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) + ResolveImageConfig(ctx context.Context, ref string, opt ResolveImageConfigOpt) (digest.Digest, []byte, error) BuildOpts() BuildOpts } @@ -50,3 +50,9 @@ type BuildOpts struct { Workers []WorkerInfo Product string } + +type ResolveImageConfigOpt struct { + Platform *specs.Platform + ResolveMode string + // Definition []byte +} diff --git a/frontend/gateway/gateway.go b/frontend/gateway/gateway.go index e9b984f5..09a78cb9 100644 --- a/frontend/gateway/gateway.go +++ b/frontend/gateway/gateway.go @@ -18,6 +18,7 @@ import ( "github.com/moby/buildkit/executor" "github.com/moby/buildkit/exporter/containerimage/exptypes" "github.com/moby/buildkit/frontend" + gw "github.com/moby/buildkit/frontend/gateway/client" pb "github.com/moby/buildkit/frontend/gateway/pb" "github.com/moby/buildkit/identity" "github.com/moby/buildkit/session" @@ -109,7 +110,7 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten return nil, err } - dgst, config, err := llbBridge.ResolveImageConfig(ctx, reference.TagNameOnly(sourceRef).String(), nil) // TODO: + dgst, config, err := llbBridge.ResolveImageConfig(ctx, reference.TagNameOnly(sourceRef).String(), gw.ResolveImageConfigOpt{}) if err != nil { return nil, err } @@ -322,7 +323,10 @@ func (lbf *llbBridgeForwarder) ResolveImageConfig(ctx context.Context, req *pb.R OSFeatures: p.OSFeatures, } } - dgst, dt, err := lbf.llbBridge.ResolveImageConfig(ctx, req.Ref, platform) + dgst, dt, err := lbf.llbBridge.ResolveImageConfig(ctx, req.Ref, gw.ResolveImageConfigOpt{ + Platform: platform, + ResolveMode: req.ResolveMode, + }) if err != nil { return nil, err } diff --git a/frontend/gateway/grpcclient/client.go b/frontend/gateway/grpcclient/client.go index 3647c5d8..6b98cdaf 100644 --- a/frontend/gateway/grpcclient/client.go +++ b/frontend/gateway/grpcclient/client.go @@ -15,7 +15,6 @@ import ( opspb "github.com/moby/buildkit/solver/pb" "github.com/moby/buildkit/util/apicaps" digest "github.com/opencontainers/go-digest" - specs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" "google.golang.org/grpc" "google.golang.org/grpc/status" @@ -290,9 +289,9 @@ func (c *grpcClient) Solve(ctx context.Context, creq client.SolveRequest) (*clie return res, nil } -func (c *grpcClient) ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) { +func (c *grpcClient) ResolveImageConfig(ctx context.Context, ref string, opt client.ResolveImageConfigOpt) (digest.Digest, []byte, error) { var p *opspb.Platform - if platform != nil { + if platform := opt.Platform; platform != nil { p = &opspb.Platform{ OS: platform.OS, Architecture: platform.Architecture, @@ -301,7 +300,7 @@ func (c *grpcClient) ResolveImageConfig(ctx context.Context, ref string, platfor OSFeatures: platform.OSFeatures, } } - resp, err := c.client.ResolveImageConfig(ctx, &pb.ResolveImageConfigRequest{Ref: ref, Platform: p}) + resp, err := c.client.ResolveImageConfig(ctx, &pb.ResolveImageConfigRequest{Ref: ref, Platform: p, ResolveMode: opt.ResolveMode}) if err != nil { return "", nil, err } diff --git a/frontend/gateway/pb/caps.go b/frontend/gateway/pb/caps.go index b5e902b1..f4407689 100644 --- a/frontend/gateway/pb/caps.go +++ b/frontend/gateway/pb/caps.go @@ -9,12 +9,13 @@ var Caps apicaps.CapList // considered immutable. After a capability is marked stable it should not be disabled. const ( - CapSolveBase apicaps.CapID = "solve.base" - CapSolveInlineReturn apicaps.CapID = "solve.inlinereturn" - CapResolveImage apicaps.CapID = "resolveimage" - CapReadFile apicaps.CapID = "readfile" - CapReturnResult apicaps.CapID = "return" - CapReturnMap apicaps.CapID = "returnmap" + CapSolveBase apicaps.CapID = "solve.base" + CapSolveInlineReturn apicaps.CapID = "solve.inlinereturn" + CapResolveImage apicaps.CapID = "resolveimage" + CapResolveImageResolveMode apicaps.CapID = "resolveimage.resolvemode" + CapReadFile apicaps.CapID = "readfile" + CapReturnResult apicaps.CapID = "return" + CapReturnMap apicaps.CapID = "returnmap" ) func init() { @@ -40,6 +41,13 @@ func init() { Status: apicaps.CapStatusExperimental, }) + Caps.Init(apicaps.Cap{ + ID: CapResolveImageResolveMode, + Name: "resolve remote image config with custom resolvemode", + Enabled: true, + Status: apicaps.CapStatusExperimental, + }) + Caps.Init(apicaps.Cap{ ID: CapReadFile, Name: "read static file", diff --git a/frontend/gateway/pb/gateway.pb.go b/frontend/gateway/pb/gateway.pb.go index 27789c60..bea00fb3 100644 --- a/frontend/gateway/pb/gateway.pb.go +++ b/frontend/gateway/pb/gateway.pb.go @@ -227,8 +227,9 @@ func (*ReturnResponse) ProtoMessage() {} func (*ReturnResponse) Descriptor() ([]byte, []int) { return fileDescriptorGateway, []int{3} } type ResolveImageConfigRequest struct { - Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"` - Platform *pb.Platform `protobuf:"bytes,2,opt,name=Platform" json:"Platform,omitempty"` + Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"` + Platform *pb.Platform `protobuf:"bytes,2,opt,name=Platform" json:"Platform,omitempty"` + ResolveMode string `protobuf:"bytes,3,opt,name=ResolveMode,proto3" json:"ResolveMode,omitempty"` } func (m *ResolveImageConfigRequest) Reset() { *m = ResolveImageConfigRequest{} } @@ -250,6 +251,13 @@ func (m *ResolveImageConfigRequest) GetPlatform() *pb.Platform { return nil } +func (m *ResolveImageConfigRequest) GetResolveMode() string { + if m != nil { + return m.ResolveMode + } + return "" +} + type ResolveImageConfigResponse struct { Digest github_com_opencontainers_go_digest.Digest `protobuf:"bytes,1,opt,name=Digest,proto3,customtype=github.com/opencontainers/go-digest.Digest" json:"Digest"` Config []byte `protobuf:"bytes,2,opt,name=Config,proto3" json:"Config,omitempty"` @@ -890,6 +898,12 @@ func (m *ResolveImageConfigRequest) MarshalTo(dAtA []byte) (int, error) { } i += n5 } + if len(m.ResolveMode) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintGateway(dAtA, i, uint64(len(m.ResolveMode))) + i += copy(dAtA[i:], m.ResolveMode) + } return i, nil } @@ -1304,6 +1318,10 @@ func (m *ResolveImageConfigRequest) Size() (n int) { l = m.Platform.Size() n += 1 + l + sovGateway(uint64(l)) } + l = len(m.ResolveMode) + if l > 0 { + n += 1 + l + sovGateway(uint64(l)) + } return n } @@ -2111,6 +2129,35 @@ func (m *ResolveImageConfigRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResolveMode", 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.ResolveMode = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGateway(dAtA[iNdEx:]) @@ -3295,13 +3342,13 @@ var ( func init() { proto.RegisterFile("gateway.proto", fileDescriptorGateway) } var fileDescriptorGateway = []byte{ - // 969 bytes of a gzipped FileDescriptorProto + // 982 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x4b, 0x6f, 0xdb, 0x46, 0x10, 0x0e, 0x4d, 0x49, 0x91, 0x46, 0x52, 0xac, 0x2e, 0x8a, 0x42, 0xe1, 0xc1, 0x51, 0x89, 0x22, - 0x65, 0xf3, 0x20, 0x51, 0xa5, 0x45, 0xd2, 0x04, 0x48, 0x1b, 0xd9, 0x31, 0xe2, 0x56, 0x41, 0x84, - 0xcd, 0xc1, 0x40, 0xd0, 0x1e, 0x56, 0xd2, 0x92, 0x26, 0x4c, 0x71, 0xd9, 0xe5, 0xca, 0xae, 0xd0, + 0x65, 0xf3, 0x20, 0x51, 0xa5, 0x45, 0xd2, 0x04, 0x48, 0x1b, 0xd9, 0x31, 0xe2, 0x56, 0x46, 0x84, + 0xcd, 0x21, 0x40, 0xd0, 0x1e, 0x56, 0xd2, 0x92, 0x26, 0x4c, 0x71, 0xd9, 0xe5, 0xca, 0xae, 0xd0, 0x4b, 0xdb, 0x53, 0x7e, 0x5a, 0x8e, 0x3d, 0xf7, 0x10, 0x14, 0xbe, 0xf5, 0x5f, 0x14, 0xfb, 0xa0, - 0x4c, 0xbf, 0x64, 0xfb, 0xa4, 0x9d, 0xe5, 0x7c, 0x33, 0xdf, 0xce, 0x7c, 0xb3, 0x2b, 0x68, 0x47, + 0x4c, 0xbf, 0x64, 0xfb, 0xa4, 0x9d, 0xe5, 0x7c, 0x33, 0xdf, 0xec, 0x7c, 0xb3, 0x2b, 0x68, 0x47, 0x44, 0xd0, 0x43, 0xb2, 0xf0, 0x33, 0xce, 0x04, 0x43, 0xb7, 0x67, 0x6c, 0xbc, 0xf0, 0xc7, 0xf3, 0x38, 0x99, 0xee, 0xc7, 0xc2, 0x3f, 0xf8, 0xda, 0x0f, 0x39, 0x4b, 0x05, 0x4d, 0xa7, 0xce, 0xc3, 0x28, 0x16, 0x7b, 0xf3, 0xb1, 0x3f, 0x61, 0xb3, 0x20, 0x62, 0x11, 0x0b, 0x14, 0x62, 0x3c, 0x0f, @@ -3312,49 +3359,50 @@ var fileDescriptorGateway = []byte{ 0x0b, 0x01, 0x73, 0x11, 0x27, 0x12, 0x35, 0x21, 0x59, 0x2e, 0x93, 0xc8, 0x5f, 0x0d, 0x72, 0xff, 0xb3, 0xa0, 0x86, 0x69, 0x3e, 0x4f, 0x04, 0x42, 0x60, 0x73, 0x1a, 0x76, 0xad, 0x9e, 0xe5, 0x35, 0x5e, 0xdd, 0xc0, 0xd2, 0x40, 0x8f, 0xa1, 0xc2, 0x69, 0x98, 0x77, 0xd7, 0x7a, 0x96, 0xd7, 0xec, - 0x7f, 0xee, 0x5f, 0x58, 0x3f, 0x1f, 0xd3, 0xf0, 0x35, 0xc9, 0x5e, 0xdd, 0xc0, 0x0a, 0x80, 0x7e, + 0x7f, 0xee, 0x5f, 0x78, 0x7e, 0x3e, 0xa6, 0xe1, 0x2e, 0xc9, 0x5e, 0xdd, 0xc0, 0x0a, 0x80, 0x7e, 0x82, 0xfa, 0x8c, 0x0a, 0x32, 0x25, 0x82, 0x74, 0xa1, 0x67, 0x7b, 0xcd, 0x7e, 0xb0, 0x12, 0x2c, - 0x19, 0xf8, 0xaf, 0x0d, 0xe2, 0x65, 0x2a, 0xf8, 0x02, 0x2f, 0x03, 0x38, 0xcf, 0xa0, 0x7d, 0xe2, - 0x13, 0xea, 0x80, 0xbd, 0x4f, 0x17, 0x9a, 0x2a, 0x96, 0x4b, 0xf4, 0x29, 0x54, 0x0f, 0x48, 0x32, - 0xa7, 0x8a, 0x69, 0x0b, 0x6b, 0xe3, 0xe9, 0xda, 0x13, 0x6b, 0x50, 0x87, 0x1a, 0x57, 0xe1, 0xdd, - 0xbf, 0xd4, 0x59, 0x25, 0x4d, 0xf4, 0xbd, 0x39, 0x97, 0xa5, 0xa8, 0xdd, 0xbf, 0xf4, 0x5c, 0xf2, - 0x27, 0xd7, 0xb4, 0x14, 0xd0, 0x79, 0x0c, 0x8d, 0xe5, 0xd6, 0x65, 0x74, 0x1a, 0x25, 0x3a, 0xae, - 0x80, 0x36, 0xa6, 0x62, 0xce, 0x53, 0x4c, 0x7f, 0x9d, 0xd3, 0x5c, 0xa0, 0xef, 0x0a, 0x7e, 0x0a, - 0x7f, 0x59, 0x91, 0xa5, 0x23, 0x36, 0x00, 0xe4, 0x41, 0x95, 0x72, 0xce, 0xb8, 0x69, 0x0f, 0xf2, - 0xb5, 0xf2, 0x7c, 0x9e, 0x4d, 0xfc, 0xb7, 0x4a, 0x79, 0x58, 0x3b, 0xb8, 0x1d, 0xb8, 0x55, 0x64, - 0xcd, 0x33, 0x96, 0xe6, 0xd4, 0xdd, 0x85, 0xdb, 0x98, 0x2a, 0xdd, 0xed, 0xcc, 0x48, 0x44, 0x37, - 0x59, 0x1a, 0xc6, 0x51, 0xc1, 0xa9, 0x03, 0x36, 0x2e, 0xa4, 0x80, 0xe5, 0x12, 0x79, 0x50, 0x1f, - 0x25, 0x44, 0x84, 0x8c, 0xcf, 0x4c, 0xb6, 0x96, 0x9f, 0x8d, 0xfd, 0x62, 0x0f, 0x2f, 0xbf, 0xba, - 0x7f, 0x58, 0xe0, 0x9c, 0x17, 0x59, 0xe7, 0x45, 0x3f, 0x42, 0x6d, 0x2b, 0x8e, 0x68, 0xae, 0x8f, - 0xdb, 0x18, 0xf4, 0x3f, 0x7c, 0xbc, 0x73, 0xe3, 0x9f, 0x8f, 0x77, 0xee, 0x95, 0xd4, 0xcb, 0x32, - 0x9a, 0x4e, 0x58, 0x2a, 0x48, 0x9c, 0x52, 0x2e, 0xe7, 0xe9, 0xe1, 0x54, 0x41, 0x7c, 0x8d, 0xc4, - 0x26, 0x02, 0xfa, 0x0c, 0x6a, 0x3a, 0xba, 0xe9, 0xba, 0xb1, 0xdc, 0xf7, 0x36, 0xb4, 0xde, 0x4a, - 0x02, 0xc5, 0x79, 0x7c, 0x80, 0x2d, 0x1a, 0xc6, 0x69, 0x2c, 0x62, 0x96, 0x9a, 0x3a, 0xdf, 0x92, - 0xfc, 0x8f, 0x77, 0x71, 0xc9, 0x03, 0x39, 0x50, 0xdf, 0x36, 0x35, 0x37, 0x1d, 0x5c, 0xda, 0xe8, - 0x1d, 0x34, 0x8b, 0xf5, 0x9b, 0x4c, 0x74, 0x6d, 0xa5, 0xa0, 0x27, 0x2b, 0x9a, 0x56, 0x66, 0xe2, - 0x97, 0xa0, 0x5a, 0x4e, 0xe5, 0x60, 0xc8, 0x83, 0xf5, 0x9d, 0x59, 0xc6, 0xb8, 0xd8, 0x24, 0x93, - 0x3d, 0x2a, 0x05, 0xd6, 0xad, 0xf4, 0x6c, 0xaf, 0x81, 0x4f, 0x6f, 0xa3, 0x07, 0xf0, 0x09, 0x49, - 0x12, 0x76, 0x68, 0x14, 0xa1, 0x7a, 0xdb, 0xad, 0xf6, 0x2c, 0xaf, 0x8e, 0xcf, 0x7e, 0x90, 0x72, - 0xdc, 0x8e, 0x53, 0x92, 0x74, 0x41, 0x79, 0x68, 0x03, 0xb9, 0xd0, 0x7a, 0xf9, 0x9b, 0x0c, 0x4b, - 0xf9, 0x0b, 0x21, 0x78, 0xb7, 0xa9, 0x8a, 0x78, 0x62, 0xcf, 0x79, 0x0e, 0x9d, 0xd3, 0x94, 0xaf, - 0x25, 0xf7, 0x9f, 0xa1, 0x6d, 0xce, 0x6f, 0xfa, 0xdf, 0x29, 0xdd, 0x32, 0xfa, 0x8e, 0x39, 0x1e, - 0x00, 0xfb, 0x9a, 0x03, 0xe0, 0xfe, 0x0e, 0xeb, 0x98, 0x92, 0xe9, 0x76, 0x9c, 0xd0, 0x8b, 0xa5, - 0x2b, 0x9b, 0x19, 0x27, 0x74, 0x44, 0xc4, 0xde, 0xb2, 0x99, 0xc6, 0x46, 0x4f, 0xa1, 0x8a, 0x49, - 0x1a, 0x51, 0x93, 0xfa, 0x8b, 0x15, 0xa9, 0x55, 0x12, 0xe9, 0x8b, 0x35, 0xc4, 0x7d, 0x06, 0x8d, - 0xe5, 0x9e, 0x94, 0xe2, 0x9b, 0x30, 0xcc, 0xa9, 0x96, 0xb5, 0x8d, 0x8d, 0x25, 0xf7, 0x87, 0x34, - 0x8d, 0x4c, 0x6a, 0x1b, 0x1b, 0xcb, 0xbd, 0x0b, 0x9d, 0x63, 0xe6, 0xa6, 0x34, 0x08, 0x2a, 0x5b, - 0xf2, 0xbe, 0xb4, 0x54, 0x1f, 0xd4, 0xda, 0x6d, 0x43, 0x73, 0x14, 0xa7, 0xc5, 0x60, 0xba, 0x47, - 0x16, 0xb4, 0x46, 0x2c, 0x3d, 0x1e, 0xa7, 0x11, 0xac, 0x17, 0xfd, 0x79, 0x31, 0xda, 0xd9, 0x24, - 0x59, 0x71, 0xa7, 0xf5, 0xce, 0x1e, 0xc5, 0xbc, 0x00, 0xbe, 0x76, 0x1c, 0x54, 0xe4, 0xe4, 0xe1, - 0xd3, 0x70, 0xf4, 0x03, 0xdc, 0x1c, 0x0e, 0x07, 0x2a, 0xd2, 0xda, 0xb5, 0x22, 0x15, 0x30, 0xf4, - 0x1c, 0x6e, 0xee, 0xaa, 0x87, 0x29, 0x37, 0xd3, 0x71, 0x4e, 0x59, 0xd5, 0xfb, 0xe5, 0x6b, 0x37, - 0x4c, 0x27, 0x8c, 0x4f, 0x71, 0x01, 0xea, 0xbf, 0xaf, 0x40, 0x63, 0x38, 0x1c, 0x0c, 0x78, 0x3c, - 0x8d, 0x28, 0xfa, 0xd3, 0x02, 0x74, 0xf6, 0x3e, 0x41, 0xdf, 0xac, 0x56, 0xc9, 0xf9, 0x17, 0x9b, - 0xf3, 0xed, 0x35, 0x51, 0xa6, 0xca, 0xef, 0xa0, 0xaa, 0x54, 0x8c, 0xbe, 0xbc, 0xe2, 0x9c, 0x3b, - 0xde, 0xe5, 0x8e, 0x26, 0xf6, 0x04, 0xea, 0x85, 0x12, 0xd0, 0xbd, 0x95, 0xf4, 0x4e, 0x08, 0xdd, - 0xb9, 0x7f, 0x25, 0x5f, 0x93, 0x64, 0x17, 0x2a, 0x52, 0x46, 0xe8, 0xee, 0x0a, 0x50, 0x49, 0x67, - 0xce, 0xaa, 0x73, 0x9e, 0xd0, 0xdf, 0x2f, 0xf2, 0x49, 0x55, 0x77, 0x8c, 0xb7, 0x92, 0x4f, 0xe9, - 0xc5, 0x73, 0xbe, 0xba, 0x82, 0xa7, 0x0e, 0x3f, 0x68, 0x7d, 0x38, 0xda, 0xb0, 0xfe, 0x3e, 0xda, - 0xb0, 0xfe, 0x3d, 0xda, 0xb0, 0xc6, 0x35, 0xf5, 0x9f, 0xe5, 0xd1, 0xff, 0x01, 0x00, 0x00, 0xff, - 0xff, 0xb8, 0xcb, 0x8c, 0xfa, 0xd6, 0x09, 0x00, 0x00, + 0x19, 0xf8, 0xbb, 0x06, 0xf1, 0x32, 0x15, 0x7c, 0x81, 0x97, 0x01, 0x9c, 0x67, 0xd0, 0x3e, 0xf1, + 0x09, 0x75, 0xc0, 0xde, 0xa7, 0x0b, 0x4d, 0x15, 0xcb, 0x25, 0xfa, 0x14, 0xaa, 0x07, 0x24, 0x99, + 0x53, 0xc5, 0xb4, 0x85, 0xb5, 0xf1, 0x74, 0xed, 0x89, 0x35, 0xa8, 0x43, 0x8d, 0xab, 0xf0, 0xee, + 0x5f, 0xaa, 0x56, 0x49, 0x13, 0x7d, 0x6f, 0xea, 0xb2, 0x14, 0xb5, 0xfb, 0x97, 0xd6, 0x25, 0x7f, + 0x72, 0x4d, 0x4b, 0x01, 0x9d, 0xc7, 0xd0, 0x58, 0x6e, 0x5d, 0x46, 0xa7, 0x51, 0xa2, 0xe3, 0x0a, + 0x68, 0x63, 0x2a, 0xe6, 0x3c, 0xc5, 0xf4, 0xd7, 0x39, 0xcd, 0x05, 0xfa, 0xae, 0xe0, 0xa7, 0xf0, + 0x97, 0x1d, 0xb2, 0x74, 0xc4, 0x06, 0x80, 0x3c, 0xa8, 0x52, 0xce, 0x19, 0x37, 0xed, 0x41, 0xbe, + 0x56, 0x9e, 0xcf, 0xb3, 0x89, 0xff, 0x46, 0x29, 0x0f, 0x6b, 0x07, 0xb7, 0x03, 0xb7, 0x8a, 0xac, + 0x79, 0xc6, 0xd2, 0x9c, 0xba, 0x0b, 0xb8, 0x8d, 0xa9, 0xd2, 0xdd, 0xce, 0x8c, 0x44, 0x74, 0x93, + 0xa5, 0x61, 0x1c, 0x15, 0x9c, 0x3a, 0x60, 0xe3, 0x42, 0x0a, 0x58, 0x2e, 0x91, 0x07, 0xf5, 0x51, + 0x42, 0x44, 0xc8, 0xf8, 0xcc, 0x64, 0x6b, 0xf9, 0xd9, 0xd8, 0x2f, 0xf6, 0xf0, 0xf2, 0x2b, 0xea, + 0x41, 0xd3, 0x04, 0xde, 0x65, 0x53, 0xda, 0xb5, 0x55, 0x8c, 0xf2, 0x96, 0xfb, 0x87, 0x05, 0xce, + 0x79, 0xb9, 0x35, 0x33, 0xf4, 0x23, 0xd4, 0xb6, 0xe2, 0x88, 0xe6, 0xfa, 0x40, 0x1a, 0x83, 0xfe, + 0x87, 0x8f, 0x77, 0x6e, 0xfc, 0xf3, 0xf1, 0xce, 0xbd, 0x92, 0xbe, 0x59, 0x46, 0xd3, 0x09, 0x4b, + 0x05, 0x89, 0x53, 0xca, 0xe5, 0xc4, 0x3d, 0x9c, 0x2a, 0x88, 0xaf, 0x91, 0xd8, 0x44, 0x40, 0x9f, + 0x41, 0x4d, 0x47, 0x37, 0xba, 0x30, 0x96, 0xfb, 0xde, 0x86, 0xd6, 0x1b, 0x49, 0xa0, 0xa8, 0xd8, + 0x07, 0xd8, 0xa2, 0x61, 0x9c, 0xc6, 0x22, 0x66, 0xa9, 0xe9, 0xc4, 0x2d, 0x59, 0xe1, 0xf1, 0x2e, + 0x2e, 0x79, 0x20, 0x07, 0xea, 0xdb, 0xa6, 0x2b, 0xa6, 0xc7, 0x4b, 0x1b, 0xbd, 0x83, 0x66, 0xb1, + 0x7e, 0x9d, 0x89, 0xae, 0xad, 0x34, 0xf6, 0x64, 0x45, 0x5b, 0xcb, 0x4c, 0xfc, 0x12, 0x54, 0x0b, + 0xae, 0x1c, 0x0c, 0x79, 0xb0, 0xbe, 0x33, 0xcb, 0x18, 0x17, 0x9b, 0x64, 0xb2, 0x47, 0xa5, 0x04, + 0xbb, 0x95, 0x9e, 0xed, 0x35, 0xf0, 0xe9, 0x6d, 0xf4, 0x00, 0x3e, 0x21, 0x49, 0xc2, 0x0e, 0x8d, + 0x66, 0x54, 0xf7, 0xbb, 0xd5, 0x9e, 0xe5, 0xd5, 0xf1, 0xd9, 0x0f, 0x52, 0xb0, 0xdb, 0x71, 0x4a, + 0x92, 0x2e, 0x28, 0x0f, 0x6d, 0x20, 0x17, 0x5a, 0x2f, 0x7f, 0x93, 0x61, 0x29, 0x7f, 0x21, 0x04, + 0xef, 0x36, 0xd5, 0x21, 0x9e, 0xd8, 0x73, 0x9e, 0x43, 0xe7, 0x34, 0xe5, 0x6b, 0x0d, 0xc4, 0xcf, + 0xd0, 0x36, 0xf5, 0x9b, 0xfe, 0x77, 0x4a, 0xf7, 0x90, 0xbe, 0x85, 0x8e, 0x47, 0xc4, 0xbe, 0xe6, + 0x88, 0xb8, 0xbf, 0xc3, 0x3a, 0xa6, 0x64, 0xba, 0x1d, 0x27, 0xf4, 0x62, 0x71, 0xcb, 0x66, 0xc6, + 0x09, 0x1d, 0x11, 0xb1, 0xb7, 0x6c, 0xa6, 0xb1, 0xd1, 0x53, 0xa8, 0x62, 0x92, 0x46, 0xd4, 0xa4, + 0xfe, 0x62, 0x45, 0x6a, 0x95, 0x44, 0xfa, 0x62, 0x0d, 0x71, 0x9f, 0x41, 0x63, 0xb9, 0x27, 0xa5, + 0xf8, 0x3a, 0x0c, 0x73, 0xaa, 0x65, 0x6d, 0x63, 0x63, 0xc9, 0xfd, 0x21, 0x4d, 0x23, 0x93, 0xda, + 0xc6, 0xc6, 0x72, 0xef, 0x42, 0xe7, 0x98, 0xb9, 0x39, 0x1a, 0x04, 0x95, 0x2d, 0x79, 0xa3, 0x5a, + 0xaa, 0x0f, 0x6a, 0xed, 0xb6, 0xa1, 0x39, 0x8a, 0xd3, 0x62, 0x74, 0xdd, 0x23, 0x0b, 0x5a, 0x23, + 0x96, 0x1e, 0x8f, 0xd3, 0x08, 0xd6, 0x8b, 0xfe, 0xbc, 0x18, 0xed, 0x6c, 0x92, 0xac, 0xb8, 0xf5, + 0x7a, 0x67, 0x4b, 0x31, 0x6f, 0x84, 0xaf, 0x1d, 0x07, 0x15, 0x39, 0x79, 0xf8, 0x34, 0x1c, 0xfd, + 0x00, 0x37, 0x87, 0xc3, 0x81, 0x8a, 0xb4, 0x76, 0xad, 0x48, 0x05, 0x0c, 0x3d, 0x87, 0x9b, 0x6f, + 0xd5, 0xd3, 0x95, 0x9b, 0xe9, 0x38, 0xe7, 0x58, 0xd5, 0x0b, 0xe7, 0x6b, 0x37, 0x4c, 0x27, 0x8c, + 0x4f, 0x71, 0x01, 0xea, 0xbf, 0xaf, 0x40, 0x63, 0x38, 0x1c, 0x0c, 0x78, 0x3c, 0x8d, 0x28, 0xfa, + 0xd3, 0x02, 0x74, 0xf6, 0x3e, 0x41, 0xdf, 0xac, 0x56, 0xc9, 0xf9, 0x57, 0x9f, 0xf3, 0xed, 0x35, + 0x51, 0xe6, 0x94, 0xdf, 0x41, 0x55, 0xa9, 0x18, 0x7d, 0x79, 0xc5, 0x39, 0x77, 0xbc, 0xcb, 0x1d, + 0x4d, 0xec, 0x09, 0xd4, 0x0b, 0x25, 0xa0, 0x7b, 0x2b, 0xe9, 0x9d, 0x10, 0xba, 0x73, 0xff, 0x4a, + 0xbe, 0x26, 0xc9, 0x5b, 0xa8, 0x48, 0x19, 0xa1, 0xbb, 0x2b, 0x40, 0x25, 0x9d, 0x39, 0xab, 0xea, + 0x3c, 0xa1, 0xbf, 0x5f, 0xe4, 0xa3, 0xab, 0xee, 0x18, 0x6f, 0x25, 0x9f, 0xd2, 0x9b, 0xe8, 0x7c, + 0x75, 0x05, 0x4f, 0x1d, 0x7e, 0xd0, 0xfa, 0x70, 0xb4, 0x61, 0xfd, 0x7d, 0xb4, 0x61, 0xfd, 0x7b, + 0xb4, 0x61, 0x8d, 0x6b, 0xea, 0x5f, 0xcd, 0xa3, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf4, 0x11, + 0x1c, 0x4b, 0xf8, 0x09, 0x00, 0x00, } diff --git a/frontend/gateway/pb/gateway.proto b/frontend/gateway/pb/gateway.proto index 8f40a335..1f19dcb5 100644 --- a/frontend/gateway/pb/gateway.proto +++ b/frontend/gateway/pb/gateway.proto @@ -46,6 +46,8 @@ message ReturnResponse { message ResolveImageConfigRequest { string Ref = 1; pb.Platform Platform = 2; + string ResolveMode = 3; +/* bytes Definition = 4;*/ } message ResolveImageConfigResponse { diff --git a/solver/llbsolver/bridge.go b/solver/llbsolver/bridge.go index d4d79f3a..731b8864 100644 --- a/solver/llbsolver/bridge.go +++ b/solver/llbsolver/bridge.go @@ -11,6 +11,7 @@ import ( "github.com/moby/buildkit/cache/remotecache" "github.com/moby/buildkit/executor" "github.com/moby/buildkit/frontend" + gw "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/solver" "github.com/moby/buildkit/util/tracing" "github.com/moby/buildkit/worker" @@ -127,12 +128,12 @@ func (s *llbBridge) Exec(ctx context.Context, meta executor.Meta, root cache.Imm return err } -func (s *llbBridge) ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) { +func (s *llbBridge) ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) { w, err := s.resolveWorker() if err != nil { return "", nil, err } - return w.ResolveImageConfig(ctx, ref, platform) + return w.ResolveImageConfig(ctx, ref, opt) } type lazyCacheManager struct { diff --git a/source/containerimage/pull.go b/source/containerimage/pull.go index 1b4d17bc..de59cde6 100644 --- a/source/containerimage/pull.go +++ b/source/containerimage/pull.go @@ -11,6 +11,7 @@ import ( "github.com/containerd/containerd/platforms" "github.com/docker/distribution/reference" "github.com/moby/buildkit/cache" + gw "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/session" "github.com/moby/buildkit/snapshot" "github.com/moby/buildkit/source" @@ -53,17 +54,23 @@ func (is *imageSource) ID() string { return source.DockerImageScheme } -func (is *imageSource) ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) { +func (is *imageSource) ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) { type t struct { dgst digest.Digest dt []byte } key := ref - if platform != nil { + if platform := opt.Platform; platform != nil { key += platforms.Format(*platform) } + + rm, err := source.ParseImageResolveMode(opt.ResolveMode) + if err != nil { + return "", nil, err + } + res, err := is.g.Do(ctx, key, func(ctx context.Context) (interface{}, error) { - dgst, dt, err := imageutil.Config(ctx, ref, pull.NewResolver(ctx, is.SessionManager, is.ImageStore, source.ResolveModeDefault), is.ContentStore, platform) + dgst, dt, err := imageutil.Config(ctx, ref, pull.NewResolver(ctx, is.SessionManager, is.ImageStore, rm), is.ContentStore, opt.Platform) if err != nil { return nil, err } diff --git a/source/identifier.go b/source/identifier.go index ae20679d..9bfd9d67 100644 --- a/source/identifier.go +++ b/source/identifier.go @@ -59,6 +59,7 @@ func FromString(s string) (Identifier, error) { return nil, errors.Wrapf(errNotFound, "unknown schema %s", parts[0]) } } + func FromLLB(op *pb.Op_Source, platform *pb.Platform) (Identifier, error) { id, err := FromString(op.Source.Identifier) if err != nil { @@ -78,16 +79,11 @@ func FromLLB(op *pb.Op_Source, platform *pb.Platform) (Identifier, error) { for k, v := range op.Source.Attrs { switch k { case pb.AttrImageResolveMode: - switch v { - case pb.AttrImageResolveModeDefault, "": - id.ResolveMode = ResolveModeDefault - case pb.AttrImageResolveModeForcePull: - id.ResolveMode = ResolveModeForcePull - case pb.AttrImageResolveModePreferLocal: - id.ResolveMode = ResolveModePreferLocal - default: - return nil, errors.Errorf("invalid resolvemode: %s", v) + rm, err := ParseImageResolveMode(v) + if err != nil { + return nil, err } + id.ResolveMode = rm } } } @@ -230,3 +226,16 @@ type HttpIdentifier struct { func (_ *HttpIdentifier) ID() string { return HttpsScheme } + +func ParseImageResolveMode(v string) (ResolveMode, error) { + switch v { + case pb.AttrImageResolveModeDefault, "": + return ResolveModeDefault, nil + case pb.AttrImageResolveModeForcePull: + return ResolveModeForcePull, nil + case pb.AttrImageResolveModePreferLocal: + return ResolveModePreferLocal, nil + default: + return 0, errors.Errorf("invalid resolvemode: %s", v) + } +} diff --git a/worker/base/worker.go b/worker/base/worker.go index 18761fcc..45828649 100644 --- a/worker/base/worker.go +++ b/worker/base/worker.go @@ -24,6 +24,7 @@ import ( localexporter "github.com/moby/buildkit/exporter/local" ociexporter "github.com/moby/buildkit/exporter/oci" "github.com/moby/buildkit/frontend" + gw "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/identity" "github.com/moby/buildkit/session" "github.com/moby/buildkit/snapshot" @@ -223,17 +224,17 @@ func (w *Worker) ResolveOp(v solver.Vertex, s frontend.FrontendLLBBridge) (solve return nil, errors.Errorf("could not resolve %v", v) } -func (w *Worker) ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) { +func (w *Worker) ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) { // ImageSource is typically source/containerimage resolveImageConfig, ok := w.ImageSource.(resolveImageConfig) if !ok { return "", nil, errors.Errorf("worker %q does not implement ResolveImageConfig", w.ID()) } - return resolveImageConfig.ResolveImageConfig(ctx, ref, platform) + return resolveImageConfig.ResolveImageConfig(ctx, ref, opt) } type resolveImageConfig interface { - ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) + ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) } func (w *Worker) Exec(ctx context.Context, meta executor.Meta, rootFS cache.ImmutableRef, stdin io.ReadCloser, stdout, stderr io.WriteCloser) error { diff --git a/worker/worker.go b/worker/worker.go index cd29d5ea..c6dc19c9 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -9,6 +9,7 @@ import ( "github.com/moby/buildkit/executor" "github.com/moby/buildkit/exporter" "github.com/moby/buildkit/frontend" + gw "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/solver" digest "github.com/opencontainers/go-digest" specs "github.com/opencontainers/image-spec/specs-go/v1" @@ -22,7 +23,7 @@ type Worker interface { LoadRef(id string) (cache.ImmutableRef, error) // ResolveOp resolves Vertex.Sys() to Op implementation. ResolveOp(v solver.Vertex, s frontend.FrontendLLBBridge) (solver.Op, error) - ResolveImageConfig(ctx context.Context, ref string, platform *specs.Platform) (digest.Digest, []byte, error) + ResolveImageConfig(ctx context.Context, ref string, opt gw.ResolveImageConfigOpt) (digest.Digest, []byte, error) // Exec is similar to executor.Exec but without []mount.Mount Exec(ctx context.Context, meta executor.Meta, rootFS cache.ImmutableRef, stdin io.ReadCloser, stdout, stderr io.WriteCloser) error DiskUsage(ctx context.Context, opt client.DiskUsageInfo) ([]*client.UsageInfo, error)