1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #39210 from tonistiigi/update-buildkit

vendor: update buildkit to f238f1ef
This commit is contained in:
Sebastiaan van Stijn 2019-05-14 13:04:53 -07:00 committed by GitHub
commit 8861376202
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 119 additions and 19 deletions

View file

@ -27,7 +27,7 @@ github.com/imdario/mergo 7c29201646fa3de8506f70121347
golang.org/x/sync e225da77a7e68af35c70ccbf71af2b83e6acac3c golang.org/x/sync e225da77a7e68af35c70ccbf71af2b83e6acac3c
# buildkit # buildkit
github.com/moby/buildkit 8c0fa8fdec187d8f259a349d2da16dc2dc5f144a # v0.5.0 github.com/moby/buildkit f238f1efb04f00bf0cc147141fda9ddb55c8bc49
github.com/tonistiigi/fsutil 3bbb99cdbd76619ab717299830c60f6f2a533a6b github.com/tonistiigi/fsutil 3bbb99cdbd76619ab717299830c60f6f2a533a6b
github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746 github.com/grpc-ecosystem/grpc-opentracing 8e809c8a86450a29b90dcc9efbf062d0fe6d9746
github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7 github.com/opentracing/opentracing-go 1361b9cd60be79c4c3a7fa9841b3c132e40066a7

View file

@ -177,7 +177,7 @@ func (e *ExecOp) Marshal(c *Constraints) (digest.Digest, []byte, *pb.OpMetadata,
addCap(&e.constraints, pb.CapExecMetaNetwork) addCap(&e.constraints, pb.CapExecMetaNetwork)
} }
if e.meta.Security != SecurityModeInsecure { if e.meta.Security != SecurityModeSandbox {
addCap(&e.constraints, pb.CapExecMetaSecurity) addCap(&e.constraints, pb.CapExecMetaSecurity)
} }

View file

@ -410,9 +410,6 @@ func parseCacheOptions(opt SolveOpt) (*cacheOptions, error) {
if csDir == "" { if csDir == "" {
return nil, errors.New("local cache importer requires src") return nil, errors.New("local cache importer requires src")
} }
if err := os.MkdirAll(csDir, 0755); err != nil {
return nil, err
}
cs, err := contentlocal.NewStore(csDir) cs, err := contentlocal.NewStore(csDir)
if err != nil { if err != nil {
return nil, err return nil, err

View file

@ -63,7 +63,9 @@ func (gwf *GatewayForwarder) lookupForwarder(ctx context.Context) (gateway.LLBBr
go func() { go func() {
<-ctx.Done() <-ctx.Done()
gwf.mu.Lock()
gwf.updateCond.Broadcast() gwf.updateCond.Broadcast()
gwf.mu.Unlock()
}() }()
gwf.mu.RLock() gwf.mu.RLock()

View file

@ -95,6 +95,23 @@ func GenerateSpec(ctx context.Context, meta executor.Meta, mounts []executor.Mou
Options: []string{"ro", "nosuid", "noexec", "nodev"}, Options: []string{"ro", "nosuid", "noexec", "nodev"},
}) })
if processMode == NoProcessSandbox {
var maskedPaths []string
for _, s := range s.Linux.MaskedPaths {
if !hasPrefix(s, "/proc") {
maskedPaths = append(maskedPaths, s)
}
}
s.Linux.MaskedPaths = maskedPaths
var readonlyPaths []string
for _, s := range s.Linux.ReadonlyPaths {
if !hasPrefix(s, "/proc") {
readonlyPaths = append(readonlyPaths, s)
}
}
s.Linux.ReadonlyPaths = readonlyPaths
}
if meta.SecurityMode == pb.SecurityMode_INSECURE { if meta.SecurityMode == pb.SecurityMode_INSECURE {
//make sysfs rw mount for insecure mode. //make sysfs rw mount for insecure mode.
for _, m := range s.Mounts { for _, m := range s.Mounts {

View file

@ -41,6 +41,8 @@ type Opt struct {
// ProcessMode // ProcessMode
ProcessMode oci.ProcessMode ProcessMode oci.ProcessMode
IdentityMapping *idtools.IdentityMapping IdentityMapping *idtools.IdentityMapping
// runc run --no-pivot (unrecommended)
NoPivot bool
} }
var defaultCommandCandidates = []string{"buildkit-runc", "runc"} var defaultCommandCandidates = []string{"buildkit-runc", "runc"}
@ -54,6 +56,7 @@ type runcExecutor struct {
networkProviders map[pb.NetMode]network.Provider networkProviders map[pb.NetMode]network.Provider
processMode oci.ProcessMode processMode oci.ProcessMode
idmap *idtools.IdentityMapping idmap *idtools.IdentityMapping
noPivot bool
} }
func New(opt Opt, networkProviders map[pb.NetMode]network.Provider) (executor.Executor, error) { func New(opt Opt, networkProviders map[pb.NetMode]network.Provider) (executor.Executor, error) {
@ -111,6 +114,7 @@ func New(opt Opt, networkProviders map[pb.NetMode]network.Provider) (executor.Ex
networkProviders: networkProviders, networkProviders: networkProviders,
processMode: opt.ProcessMode, processMode: opt.ProcessMode,
idmap: opt.IdentityMapping, idmap: opt.IdentityMapping,
noPivot: opt.NoPivot,
} }
return w, nil return w, nil
} }
@ -193,6 +197,17 @@ func (w *runcExecutor) Exec(ctx context.Context, meta executor.Meta, root cache.
opts = append(opts, containerdoci.WithRootFSReadonly()) opts = append(opts, containerdoci.WithRootFSReadonly())
} }
identity = idtools.Identity{
UID: int(uid),
GID: int(gid),
}
if w.idmap != nil {
identity, err = w.idmap.ToHost(identity)
if err != nil {
return err
}
}
if w.cgroupParent != "" { if w.cgroupParent != "" {
var cgroupsPath string var cgroupsPath string
lastSeparator := w.cgroupParent[len(w.cgroupParent)-1:] lastSeparator := w.cgroupParent[len(w.cgroupParent)-1:]
@ -269,7 +284,8 @@ func (w *runcExecutor) Exec(ctx context.Context, meta executor.Meta, root cache.
logrus.Debugf("> creating %s %v", id, meta.Args) logrus.Debugf("> creating %s %v", id, meta.Args)
status, err := w.runc.Run(runCtx, id, bundle, &runc.CreateOpts{ status, err := w.runc.Run(runCtx, id, bundle, &runc.CreateOpts{
IO: &forwardIO{stdin: stdin, stdout: stdout, stderr: stderr}, IO: &forwardIO{stdin: stdin, stdout: stdout, stderr: stderr},
NoPivot: w.noPivot,
}) })
close(done) close(done)
if err != nil { if err != nil {

View file

@ -172,10 +172,6 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
} }
} }
if len(allDispatchStates.states) == 1 {
allDispatchStates.states[0].stageName = ""
}
var target *dispatchState var target *dispatchState
if opt.Target == "" { if opt.Target == "" {
target = allDispatchStates.lastTarget() target = allDispatchStates.lastTarget()
@ -207,6 +203,14 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
} }
} }
if has, state := hasCircularDependency(allDispatchStates.states); has {
return nil, nil, fmt.Errorf("circular dependency detected on stage: %s", state.stageName)
}
if len(allDispatchStates.states) == 1 {
allDispatchStates.states[0].stageName = ""
}
eg, ctx := errgroup.WithContext(ctx) eg, ctx := errgroup.WithContext(ctx)
for i, d := range allDispatchStates.states { for i, d := range allDispatchStates.states {
reachable := isReachable(target, d) reachable := isReachable(target, d)
@ -1130,6 +1134,41 @@ func isReachable(from, to *dispatchState) (ret bool) {
return false return false
} }
func hasCircularDependency(states []*dispatchState) (bool, *dispatchState) {
var visit func(state *dispatchState) bool
if states == nil {
return false, nil
}
visited := make(map[*dispatchState]struct{})
path := make(map[*dispatchState]struct{})
visit = func(state *dispatchState) bool {
_, ok := visited[state]
if ok {
return false
}
visited[state] = struct{}{}
path[state] = struct{}{}
for dep := range state.deps {
_, ok = path[dep]
if ok {
return true
}
if visit(dep) {
return true
}
}
delete(path, state)
return false
}
for _, state := range states {
if visit(state) {
return true, state
}
}
return false, nil
}
func parseUser(str string) (uid uint32, gid uint32, err error) { func parseUser(str string) (uid uint32, gid uint32, err error) {
if str == "" { if str == "" {
return 0, 0, nil return 0, 0, nil

View file

@ -158,7 +158,7 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten
rootFS = workerRef.ImmutableRef rootFS = workerRef.ImmutableRef
} }
lbf, err := newLLBBridgeForwarder(ctx, llbBridge, gf.workers) lbf, ctx, err := newLLBBridgeForwarder(ctx, llbBridge, gf.workers)
defer lbf.conn.Close() defer lbf.conn.Close()
if err != nil { if err != nil {
return nil, err return nil, err
@ -210,6 +210,9 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten
err = llbBridge.Exec(ctx, meta, rootFS, lbf.Stdin, lbf.Stdout, os.Stderr) err = llbBridge.Exec(ctx, meta, rootFS, lbf.Stdin, lbf.Stdout, os.Stderr)
if err != nil { if err != nil {
if errors.Cause(err) == context.Canceled && lbf.isErrServerClosed {
err = errors.Errorf("frontend grpc server closed unexpectedly")
}
// An existing error (set via Return rpc) takes // An existing error (set via Return rpc) takes
// precedence over this error, which in turn takes // precedence over this error, which in turn takes
// precedence over a success reported via Return. // precedence over a success reported via Return.
@ -294,15 +297,24 @@ func NewBridgeForwarder(ctx context.Context, llbBridge frontend.FrontendLLBBridg
return lbf return lbf
} }
func newLLBBridgeForwarder(ctx context.Context, llbBridge frontend.FrontendLLBBridge, workers frontend.WorkerInfos) (*llbBridgeForwarder, error) { func newLLBBridgeForwarder(ctx context.Context, llbBridge frontend.FrontendLLBBridge, workers frontend.WorkerInfos) (*llbBridgeForwarder, context.Context, error) {
ctx, cancel := context.WithCancel(ctx)
lbf := NewBridgeForwarder(ctx, llbBridge, workers) lbf := NewBridgeForwarder(ctx, llbBridge, workers)
server := grpc.NewServer() server := grpc.NewServer()
grpc_health_v1.RegisterHealthServer(server, health.NewServer()) grpc_health_v1.RegisterHealthServer(server, health.NewServer())
pb.RegisterLLBBridgeServer(server, lbf) pb.RegisterLLBBridgeServer(server, lbf)
go serve(ctx, server, lbf.conn) go func() {
serve(ctx, server, lbf.conn)
select {
case <-ctx.Done():
default:
lbf.isErrServerClosed = true
}
cancel()
}()
return lbf, nil return lbf, ctx, nil
} }
type pipe struct { type pipe struct {
@ -372,11 +384,12 @@ type llbBridgeForwarder struct {
// lastRef solver.CachedResult // lastRef solver.CachedResult
// lastRefs map[string]solver.CachedResult // lastRefs map[string]solver.CachedResult
// err error // err error
doneCh chan struct{} // closed when result or err become valid through a call to a Return doneCh chan struct{} // closed when result or err become valid through a call to a Return
result *frontend.Result result *frontend.Result
err error err error
exporterAttr map[string][]byte exporterAttr map[string][]byte
workers frontend.WorkerInfos workers frontend.WorkerInfos
isErrServerClosed bool
*pipe *pipe
} }

View file

@ -28,6 +28,8 @@ type GrpcClient interface {
} }
func New(ctx context.Context, opts map[string]string, session, product string, c pb.LLBBridgeClient, w []client.WorkerInfo) (GrpcClient, error) { func New(ctx context.Context, opts map[string]string, session, product string, c pb.LLBBridgeClient, w []client.WorkerInfo) (GrpcClient, error) {
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
resp, err := c.Ping(ctx, &pb.PingRequest{}) resp, err := c.Ping(ctx, &pb.PingRequest{})
if err != nil { if err != nil {
return nil, err return nil, err

View file

@ -46,6 +46,7 @@ type conn struct {
closedOnce sync.Once closedOnce sync.Once
readMu sync.Mutex readMu sync.Mutex
writeMu sync.Mutex
err error err error
closeCh chan struct{} closeCh chan struct{}
} }
@ -79,6 +80,8 @@ func (c *conn) Read(b []byte) (n int, err error) {
} }
func (c *conn) Write(b []byte) (int, error) { func (c *conn) Write(b []byte) (int, error) {
c.writeMu.Lock()
defer c.writeMu.Unlock()
m := &controlapi.BytesMessage{Data: b} m := &controlapi.BytesMessage{Data: b}
if err := c.stream.SendMsg(m); err != nil { if err := c.stream.SendMsg(m); err != nil {
return 0, err return 0, err
@ -93,7 +96,9 @@ func (c *conn) Close() (err error) {
}() }()
if cs, ok := c.stream.(grpc.ClientStream); ok { if cs, ok := c.stream.(grpc.ClientStream); ok {
c.writeMu.Lock()
err = cs.CloseSend() err = cs.CloseSend()
c.writeMu.Unlock()
if err != nil { if err != nil {
return return
} }
@ -106,6 +111,7 @@ func (c *conn) Close() (err error) {
err = c.stream.RecvMsg(m) err = c.stream.RecvMsg(m)
if err != nil { if err != nil {
if err != io.EOF { if err != io.EOF {
c.readMu.Unlock()
return return
} }
err = nil err = nil

View file

@ -162,7 +162,9 @@ func (sm *Manager) Get(ctx context.Context, id string) (Caller, error) {
go func() { go func() {
select { select {
case <-ctx.Done(): case <-ctx.Done():
sm.mu.Lock()
sm.updateCondition.Broadcast() sm.updateCondition.Broadcast()
sm.mu.Unlock()
} }
}() }()

View file

@ -404,7 +404,9 @@ func (jl *Solver) Get(id string) (*Job, error) {
go func() { go func() {
<-ctx.Done() <-ctx.Done()
jl.mu.Lock()
jl.updateCond.Broadcast() jl.updateCond.Broadcast()
jl.mu.Unlock()
}() }()
jl.mu.RLock() jl.mu.RLock()

View file

@ -101,7 +101,9 @@ func (pr *progressReader) Read(ctx context.Context) ([]*Progress, error) {
select { select {
case <-done: case <-done:
case <-ctx.Done(): case <-ctx.Done():
pr.mu.Lock()
pr.cond.Broadcast() pr.cond.Broadcast()
pr.mu.Unlock()
} }
}() }()
pr.mu.Lock() pr.mu.Lock()
@ -163,7 +165,9 @@ func pipe() (*progressReader, *progressWriter, func()) {
pr.cond = sync.NewCond(&pr.mu) pr.cond = sync.NewCond(&pr.mu)
go func() { go func() {
<-ctx.Done() <-ctx.Done()
pr.mu.Lock()
pr.cond.Broadcast() pr.cond.Broadcast()
pr.mu.Unlock()
}() }()
pw := &progressWriter{ pw := &progressWriter{
reader: pr, reader: pr,