Skip to content

Commit 3279d26

Browse files
committed
gateway: enable named contexts for gateway frontend
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent a2d1c24 commit 3279d26

File tree

8 files changed

+67
-37
lines changed

8 files changed

+67
-37
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: 7 additions & 7 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,7 +26,7 @@ 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) {
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) {
3030
bc := &bridgeClient{
3131
opts: opts,
3232
inputs: inputs,
@@ -232,11 +232,11 @@ func (c *bridgeClient) Warn(ctx context.Context, dgst digest.Digest, msg string,
232232
}
233233

234234
func (c *bridgeClient) NewContainer(ctx context.Context, req client.NewContainerRequest) (client.Container, error) {
235-
ctrReq := gateway.NewContainerRequest{
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,7 +299,7 @@ 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
}

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
}

solver/llbsolver/ops/exec.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"github.com/moby/buildkit/cache"
1515
"github.com/moby/buildkit/executor"
1616
resourcestypes "github.com/moby/buildkit/executor/resources/types"
17-
"github.com/moby/buildkit/frontend/gateway"
17+
"github.com/moby/buildkit/frontend/gateway/container"
1818
"github.com/moby/buildkit/session"
1919
"github.com/moby/buildkit/session/secrets"
2020
"github.com/moby/buildkit/solver"
@@ -260,7 +260,7 @@ func (e *ExecOp) Exec(ctx context.Context, g session.Group, inputs []solver.Resu
260260
}
261261
}
262262

263-
p, err := gateway.PrepareMounts(ctx, e.mm, e.cm, g, e.op.Meta.Cwd, e.op.Mounts, refs, func(m *pb.Mount, ref cache.ImmutableRef) (cache.MutableRef, error) {
263+
p, err := container.PrepareMounts(ctx, e.mm, e.cm, g, e.op.Meta.Cwd, e.op.Mounts, refs, func(m *pb.Mount, ref cache.ImmutableRef) (cache.MutableRef, error) {
264264
desc := fmt.Sprintf("mount %s from exec %s", m.Dest, strings.Join(e.op.Meta.Args, " "))
265265
return e.cm.New(ctx, ref, g, cache.WithDescription(desc))
266266
})
@@ -307,7 +307,7 @@ func (e *ExecOp) Exec(ctx context.Context, g session.Group, inputs []solver.Resu
307307
return nil, err
308308
}
309309

310-
extraHosts, err := gateway.ParseExtraHosts(e.op.Meta.ExtraHosts)
310+
extraHosts, err := container.ParseExtraHosts(e.op.Meta.ExtraHosts)
311311
if err != nil {
312312
return nil, err
313313
}

0 commit comments

Comments
 (0)