Skip to content

Commit b85b5ab

Browse files
authored
Merge pull request moby#3633 from tonistiigi/gateway-contexts
2 parents a2d1c24 + c5b354f commit b85b5ab

File tree

8 files changed

+81
-51
lines changed

8 files changed

+81
-51
lines changed

frontend/dockerui/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/moby/buildkit/frontend/gateway/client"
2020
"github.com/moby/buildkit/solver/pb"
2121
"github.com/moby/buildkit/util/flightcontrol"
22+
digest "github.com/opencontainers/go-digest"
2223
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
2324
"github.com/pkg/errors"
2425
)
@@ -96,6 +97,7 @@ type ContextOpt struct {
9697
LocalOpts []llb.LocalOption
9798
Platform *ocispecs.Platform
9899
ResolveMode string
100+
CaptureDigest *digest.Digest
99101
}
100102

101103
func validateMinCaps(c client.Client) error {

frontend/dockerui/namedcontext.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (bc *Client) namedContext(ctx context.Context, name string, nameWithPlatfor
5858

5959
named = reference.TagNameOnly(named)
6060

61-
_, data, err := bc.client.ResolveImageConfig(ctx, named.String(), llb.ResolveImageConfigOpt{
61+
dgst, data, err := bc.client.ResolveImageConfig(ctx, named.String(), llb.ResolveImageConfigOpt{
6262
Platform: opt.Platform,
6363
ResolveMode: opt.ResolveMode,
6464
LogName: fmt.Sprintf("[context %s] load metadata for %s", nameWithPlatform, ref),
@@ -67,7 +67,6 @@ func (bc *Client) namedContext(ctx context.Context, name string, nameWithPlatfor
6767
if err != nil {
6868
return nil, nil, err
6969
}
70-
7170
var img image.Image
7271
if err := json.Unmarshal(data, &img); err != nil {
7372
return nil, nil, err
@@ -79,6 +78,9 @@ func (bc *Client) namedContext(ctx context.Context, name string, nameWithPlatfor
7978
if err != nil {
8079
return nil, nil, err
8180
}
81+
if opt.CaptureDigest != nil {
82+
*opt.CaptureDigest = dgst
83+
}
8284
return &st, &img, nil
8385
case "git":
8486
st, ok := DetectGitContext(v, true)
@@ -119,7 +121,7 @@ func (bc *Client) namedContext(ctx context.Context, name string, nameWithPlatfor
119121
return nil, nil, errors.Wrapf(err, "could not wrap %q with digest", name)
120122
}
121123

122-
_, data, err := bc.client.ResolveImageConfig(ctx, dummyRef.String(), llb.ResolveImageConfigOpt{
124+
dgst, data, err := bc.client.ResolveImageConfig(ctx, dummyRef.String(), llb.ResolveImageConfigOpt{
123125
Platform: opt.Platform,
124126
ResolveMode: opt.ResolveMode,
125127
LogName: fmt.Sprintf("[context %s] load metadata for %s", nameWithPlatform, dummyRef.String()),
@@ -153,6 +155,9 @@ func (bc *Client) namedContext(ctx context.Context, name string, nameWithPlatfor
153155
if err != nil {
154156
return nil, nil, err
155157
}
158+
if opt.CaptureDigest != nil {
159+
*opt.CaptureDigest = dgst
160+
}
156161
return &st, &img, nil
157162
case "local":
158163
st := llb.Local(vv[1],

frontend/gateway/container.go renamed to frontend/gateway/container/container.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package gateway
1+
package container
22

33
import (
44
"context"
@@ -261,9 +261,9 @@ func PrepareMounts(ctx context.Context, mm *mounts.MountManager, cm cache.Manage
261261
})
262262
root = active
263263
}
264-
p.Root = mountWithSession(root, g)
264+
p.Root = MountWithSession(root, g)
265265
} else {
266-
mws := mountWithSession(mountable, g)
266+
mws := MountWithSession(mountable, g)
267267
dest := m.Dest
268268
if !filepath.IsAbs(filepath.Clean(dest)) {
269269
dest = filepath.Join("/", cwd, dest)
@@ -501,7 +501,7 @@ func addDefaultEnvvar(env []string, k, v string) []string {
501501
return append(env, k+"="+v)
502502
}
503503

504-
func mountWithSession(m cache.Mountable, g session.Group) executor.Mount {
504+
func MountWithSession(m cache.Mountable, g session.Group) executor.Mount {
505505
_, readonly := m.(cache.ImmutableRef)
506506
return executor.Mount{
507507
Src: &mountable{m: m, g: g},

frontend/gateway/util.go renamed to frontend/gateway/container/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package gateway
1+
package container
22

33
import (
44
"net"

frontend/gateway/forwarder/forward.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77
cacheutil "github.com/moby/buildkit/cache/util"
88
"github.com/moby/buildkit/client/llb"
99
"github.com/moby/buildkit/frontend"
10-
"github.com/moby/buildkit/frontend/gateway"
1110
"github.com/moby/buildkit/frontend/gateway/client"
11+
"github.com/moby/buildkit/frontend/gateway/container"
1212
gwpb "github.com/moby/buildkit/frontend/gateway/pb"
1313
"github.com/moby/buildkit/identity"
1414
"github.com/moby/buildkit/session"
@@ -26,8 +26,8 @@ import (
2626
"golang.org/x/sync/errgroup"
2727
)
2828

29-
func llbBridgeToGatewayClient(ctx context.Context, llbBridge frontend.FrontendLLBBridge, opts map[string]string, inputs map[string]*opspb.Definition, w worker.Infos, sid string, sm *session.Manager) (*bridgeClient, error) {
30-
bc := &bridgeClient{
29+
func LLBBridgeToGatewayClient(ctx context.Context, llbBridge frontend.FrontendLLBBridge, opts map[string]string, inputs map[string]*opspb.Definition, w worker.Infos, sid string, sm *session.Manager) (*BridgeClient, error) {
30+
bc := &BridgeClient{
3131
opts: opts,
3232
inputs: inputs,
3333
FrontendLLBBridge: llbBridge,
@@ -40,7 +40,7 @@ func llbBridgeToGatewayClient(ctx context.Context, llbBridge frontend.FrontendLL
4040
return bc, nil
4141
}
4242

43-
type bridgeClient struct {
43+
type BridgeClient struct {
4444
frontend.FrontendLLBBridge
4545
mu sync.Mutex
4646
opts map[string]string
@@ -54,7 +54,7 @@ type bridgeClient struct {
5454
ctrs []client.Container
5555
}
5656

57-
func (c *bridgeClient) Solve(ctx context.Context, req client.SolveRequest) (*client.Result, error) {
57+
func (c *BridgeClient) Solve(ctx context.Context, req client.SolveRequest) (*client.Result, error) {
5858
res, err := c.FrontendLLBBridge.Solve(ctx, frontend.SolveRequest{
5959
Evaluate: req.Evaluate,
6060
Definition: req.Definition,
@@ -91,7 +91,7 @@ func (c *bridgeClient) Solve(ctx context.Context, req client.SolveRequest) (*cli
9191

9292
return cRes, nil
9393
}
94-
func (c *bridgeClient) loadBuildOpts() client.BuildOpts {
94+
func (c *BridgeClient) loadBuildOpts() client.BuildOpts {
9595
wis := c.workers.WorkerInfos()
9696
workers := make([]client.WorkerInfo, len(wis))
9797
for i, w := range wis {
@@ -112,11 +112,11 @@ func (c *bridgeClient) loadBuildOpts() client.BuildOpts {
112112
}
113113
}
114114

115-
func (c *bridgeClient) BuildOpts() client.BuildOpts {
115+
func (c *BridgeClient) BuildOpts() client.BuildOpts {
116116
return c.buildOpts
117117
}
118118

119-
func (c *bridgeClient) Inputs(ctx context.Context) (map[string]llb.State, error) {
119+
func (c *BridgeClient) Inputs(ctx context.Context) (map[string]llb.State, error) {
120120
inputs := make(map[string]llb.State)
121121
for key, def := range c.inputs {
122122
defop, err := llb.NewDefinitionOp(def)
@@ -128,7 +128,7 @@ func (c *bridgeClient) Inputs(ctx context.Context) (map[string]llb.State, error)
128128
return inputs, nil
129129
}
130130

131-
func (c *bridgeClient) wrapSolveError(solveErr error) error {
131+
func (c *BridgeClient) wrapSolveError(solveErr error) error {
132132
var (
133133
ee *llberrdefs.ExecError
134134
fae *llberrdefs.FileActionError
@@ -162,7 +162,7 @@ func (c *bridgeClient) wrapSolveError(solveErr error) error {
162162
return errdefs.WithSolveError(solveErr, subject, inputIDs, mountIDs)
163163
}
164164

165-
func (c *bridgeClient) registerResultIDs(results ...solver.Result) (ids []string, err error) {
165+
func (c *BridgeClient) registerResultIDs(results ...solver.Result) (ids []string, err error) {
166166
c.mu.Lock()
167167
defer c.mu.Unlock()
168168

@@ -181,7 +181,7 @@ func (c *bridgeClient) registerResultIDs(results ...solver.Result) (ids []string
181181
return ids, nil
182182
}
183183

184-
func (c *bridgeClient) toFrontendResult(r *client.Result) (*frontend.Result, error) {
184+
func (c *BridgeClient) toFrontendResult(r *client.Result) (*frontend.Result, error) {
185185
if r == nil {
186186
return nil, nil
187187
}
@@ -206,7 +206,7 @@ func (c *bridgeClient) toFrontendResult(r *client.Result) (*frontend.Result, err
206206
return res, nil
207207
}
208208

209-
func (c *bridgeClient) discard(err error) {
209+
func (c *BridgeClient) discard(err error) {
210210
for _, ctr := range c.ctrs {
211211
ctr.Release(context.TODO())
212212
}
@@ -227,16 +227,16 @@ func (c *bridgeClient) discard(err error) {
227227
}
228228
}
229229

230-
func (c *bridgeClient) Warn(ctx context.Context, dgst digest.Digest, msg string, opts client.WarnOpts) error {
230+
func (c *BridgeClient) Warn(ctx context.Context, dgst digest.Digest, msg string, opts client.WarnOpts) error {
231231
return c.FrontendLLBBridge.Warn(ctx, dgst, msg, opts)
232232
}
233233

234-
func (c *bridgeClient) NewContainer(ctx context.Context, req client.NewContainerRequest) (client.Container, error) {
235-
ctrReq := gateway.NewContainerRequest{
234+
func (c *BridgeClient) NewContainer(ctx context.Context, req client.NewContainerRequest) (client.Container, error) {
235+
ctrReq := container.NewContainerRequest{
236236
ContainerID: identity.NewID(),
237237
NetMode: req.NetMode,
238238
Hostname: req.Hostname,
239-
Mounts: make([]gateway.Mount, len(req.Mounts)),
239+
Mounts: make([]container.Mount, len(req.Mounts)),
240240
}
241241

242242
eg, ctx := errgroup.WithContext(ctx)
@@ -267,7 +267,7 @@ func (c *bridgeClient) NewContainer(ctx context.Context, req client.NewContainer
267267
return errors.Errorf("failed to find ref %s for %q mount", m.ResultID, m.Dest)
268268
}
269269
}
270-
ctrReq.Mounts[i] = gateway.Mount{
270+
ctrReq.Mounts[i] = container.Mount{
271271
WorkerRef: workerRef,
272272
Mount: &opspb.Mount{
273273
Dest: m.Dest,
@@ -288,7 +288,7 @@ func (c *bridgeClient) NewContainer(ctx context.Context, req client.NewContainer
288288
return nil, err
289289
}
290290

291-
ctrReq.ExtraHosts, err = gateway.ParseExtraHosts(req.ExtraHosts)
291+
ctrReq.ExtraHosts, err = container.ParseExtraHosts(req.ExtraHosts)
292292
if err != nil {
293293
return nil, err
294294
}
@@ -299,15 +299,15 @@ func (c *bridgeClient) NewContainer(ctx context.Context, req client.NewContainer
299299
}
300300

301301
group := session.NewGroup(c.sid)
302-
ctr, err := gateway.NewContainer(ctx, w, c.sm, group, ctrReq)
302+
ctr, err := container.NewContainer(ctx, w, c.sm, group, ctrReq)
303303
if err != nil {
304304
return nil, err
305305
}
306306
c.ctrs = append(c.ctrs, ctr)
307307
return ctr, nil
308308
}
309309

310-
func (c *bridgeClient) newRef(r solver.ResultProxy, s session.Group) (*ref, error) {
310+
func (c *BridgeClient) newRef(r solver.ResultProxy, s session.Group) (*ref, error) {
311311
return &ref{resultProxy: r, session: s, c: c}, nil
312312
}
313313

@@ -316,7 +316,7 @@ type ref struct {
316316
resultProxyClones []solver.ResultProxy
317317

318318
session session.Group
319-
c *bridgeClient
319+
c *BridgeClient
320320
}
321321

322322
func (r *ref) acquireResultProxy() solver.ResultProxy {

frontend/gateway/forwarder/frontend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type GatewayForwarder struct {
2323
}
2424

2525
func (gf *GatewayForwarder) Solve(ctx context.Context, llbBridge frontend.FrontendLLBBridge, opts map[string]string, inputs map[string]*pb.Definition, sid string, sm *session.Manager) (retRes *frontend.Result, retErr error) {
26-
c, err := llbBridgeToGatewayClient(ctx, llbBridge, opts, inputs, gf.workers, sid, sm)
26+
c, err := LLBBridgeToGatewayClient(ctx, llbBridge, opts, inputs, gf.workers, sid, sm)
2727
if err != nil {
2828
return nil, err
2929
}

frontend/gateway/gateway.go

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ import (
2727
"github.com/moby/buildkit/client/llb"
2828
"github.com/moby/buildkit/executor"
2929
"github.com/moby/buildkit/exporter/containerimage/exptypes"
30+
"github.com/moby/buildkit/exporter/containerimage/image"
3031
"github.com/moby/buildkit/frontend"
32+
"github.com/moby/buildkit/frontend/dockerui"
3133
gwclient "github.com/moby/buildkit/frontend/gateway/client"
34+
"github.com/moby/buildkit/frontend/gateway/container"
35+
"github.com/moby/buildkit/frontend/gateway/forwarder"
3236
pb "github.com/moby/buildkit/frontend/gateway/pb"
3337
"github.com/moby/buildkit/identity"
3438
"github.com/moby/buildkit/session"
@@ -89,7 +93,7 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten
8993
}
9094

9195
_, isDevel := opts[keyDevel]
92-
var img ocispecs.Image
96+
var img image.Image
9397
var mfstDigest digest.Digest
9498
var rootFS cache.MutableRef
9599
var readonly bool // TODO: try to switch to read-only by default.
@@ -137,31 +141,51 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten
137141
}
138142
}
139143
} else {
140-
sourceRef, err := reference.ParseNormalizedNamed(source)
144+
c, err := forwarder.LLBBridgeToGatewayClient(ctx, llbBridge, opts, inputs, gf.workers, sid, sm)
141145
if err != nil {
142146
return nil, err
143147
}
144-
145-
dgst, config, err := llbBridge.ResolveImageConfig(ctx, reference.TagNameOnly(sourceRef).String(), llb.ResolveImageConfigOpt{})
148+
dc, err := dockerui.NewClient(c)
146149
if err != nil {
147150
return nil, err
148151
}
149-
mfstDigest = dgst
150-
151-
if err := json.Unmarshal(config, &img); err != nil {
152+
st, dockerImage, err := dc.NamedContext(ctx, source, dockerui.ContextOpt{
153+
CaptureDigest: &mfstDigest,
154+
})
155+
if err != nil {
152156
return nil, err
153157
}
158+
if dockerImage != nil {
159+
img = *dockerImage
160+
}
161+
if st == nil {
162+
sourceRef, err := reference.ParseNormalizedNamed(source)
163+
if err != nil {
164+
return nil, err
165+
}
154166

155-
if dgst != "" {
156-
sourceRef, err = reference.WithDigest(sourceRef, dgst)
167+
dgst, config, err := llbBridge.ResolveImageConfig(ctx, reference.TagNameOnly(sourceRef).String(), llb.ResolveImageConfigOpt{})
157168
if err != nil {
158169
return nil, err
159170
}
160-
}
171+
mfstDigest = dgst
172+
173+
if err := json.Unmarshal(config, &img); err != nil {
174+
return nil, err
175+
}
176+
177+
if dgst != "" {
178+
sourceRef, err = reference.WithDigest(sourceRef, dgst)
179+
if err != nil {
180+
return nil, err
181+
}
182+
}
161183

162-
src := llb.Image(sourceRef.String(), &markTypeFrontend{})
184+
src := llb.Image(sourceRef.String(), &markTypeFrontend{})
185+
st = &src
186+
}
163187

164-
def, err := src.Marshal(ctx)
188+
def, err := st.Marshal(ctx)
165189
if err != nil {
166190
return nil, err
167191
}
@@ -275,8 +299,7 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten
275299
mnts = append(mnts, *mdmnt)
276300
}
277301

278-
_, err = w.Executor().Run(ctx, "", mountWithSession(rootFS, session.NewGroup(sid)), mnts, executor.ProcessInfo{Meta: meta, Stdin: lbf.Stdin, Stdout: lbf.Stdout, Stderr: os.Stderr}, nil)
279-
302+
_, err = w.Executor().Run(ctx, "", container.MountWithSession(rootFS, session.NewGroup(sid)), mnts, executor.ProcessInfo{Meta: meta, Stdin: lbf.Stdin, Stdout: lbf.Stdout, Stderr: os.Stderr}, nil)
280303
if err != nil {
281304
if errdefs.IsCanceled(ctx, err) && lbf.isErrServerClosed {
282305
err = errors.Errorf("frontend grpc server closed unexpectedly")
@@ -954,7 +977,7 @@ func (lbf *llbBridgeForwarder) Inputs(ctx context.Context, in *pb.InputsRequest)
954977

955978
func (lbf *llbBridgeForwarder) NewContainer(ctx context.Context, in *pb.NewContainerRequest) (_ *pb.NewContainerResponse, err error) {
956979
bklog.G(ctx).Debugf("|<--- NewContainer %s", in.ContainerID)
957-
ctrReq := NewContainerRequest{
980+
ctrReq := container.NewContainerRequest{
958981
ContainerID: in.ContainerID,
959982
NetMode: in.Network,
960983
Hostname: in.Hostname,
@@ -984,7 +1007,7 @@ func (lbf *llbBridgeForwarder) NewContainer(ctx context.Context, in *pb.NewConta
9841007
}
9851008
}
9861009
}
987-
ctrReq.Mounts = append(ctrReq.Mounts, Mount{
1010+
ctrReq.Mounts = append(ctrReq.Mounts, container.Mount{
9881011
WorkerRef: workerRef,
9891012
Mount: &opspb.Mount{
9901013
Dest: m.Dest,
@@ -1007,12 +1030,12 @@ func (lbf *llbBridgeForwarder) NewContainer(ctx context.Context, in *pb.NewConta
10071030
return nil, stack.Enable(err)
10081031
}
10091032

1010-
ctrReq.ExtraHosts, err = ParseExtraHosts(in.ExtraHosts)
1033+
ctrReq.ExtraHosts, err = container.ParseExtraHosts(in.ExtraHosts)
10111034
if err != nil {
10121035
return nil, stack.Enable(err)
10131036
}
10141037

1015-
ctr, err := NewContainer(context.Background(), w, lbf.sm, group, ctrReq)
1038+
ctr, err := container.NewContainer(context.Background(), w, lbf.sm, group, ctrReq)
10161039
if err != nil {
10171040
return nil, stack.Enable(err)
10181041
}

0 commit comments

Comments
 (0)