mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 01:53:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			63 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package build
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	stderrors "errors"
 | 
						|
	"net"
 | 
						|
 | 
						|
	"github.com/containerd/platforms"
 | 
						|
	"github.com/docker/buildx/builder"
 | 
						|
	"github.com/docker/buildx/util/progress"
 | 
						|
	v1 "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						|
	"github.com/pkg/errors"
 | 
						|
)
 | 
						|
 | 
						|
func Dial(ctx context.Context, nodes []builder.Node, pw progress.Writer, platform *v1.Platform) (net.Conn, error) {
 | 
						|
	nodes, err := filterAvailableNodes(nodes)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	if len(nodes) == 0 {
 | 
						|
		return nil, errors.New("no nodes available")
 | 
						|
	}
 | 
						|
 | 
						|
	var pls []v1.Platform
 | 
						|
	if platform != nil {
 | 
						|
		pls = []v1.Platform{*platform}
 | 
						|
	}
 | 
						|
 | 
						|
	opts := map[string]Options{"default": {Platforms: pls}}
 | 
						|
	resolved, err := resolveDrivers(ctx, nodes, opts, pw)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	var dialError error
 | 
						|
	for _, ls := range resolved {
 | 
						|
		for _, rn := range ls {
 | 
						|
			if platform != nil {
 | 
						|
				p := *platform
 | 
						|
				var found bool
 | 
						|
				for _, pp := range rn.platforms {
 | 
						|
					if platforms.Only(p).Match(pp) {
 | 
						|
						found = true
 | 
						|
						break
 | 
						|
					}
 | 
						|
				}
 | 
						|
				if !found {
 | 
						|
					continue
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			conn, err := nodes[rn.driverIndex].Driver.Dial(ctx)
 | 
						|
			if err == nil {
 | 
						|
				return conn, nil
 | 
						|
			}
 | 
						|
			dialError = stderrors.Join(err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return nil, errors.Wrap(dialError, "no nodes available")
 | 
						|
}
 |