mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 10:03:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package build
 | 
						|
 | 
						|
import (
 | 
						|
	"archive/tar"
 | 
						|
	"bytes"
 | 
						|
	"context"
 | 
						|
	"net"
 | 
						|
	"os"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/docker/buildx/driver"
 | 
						|
	"github.com/docker/cli/opts"
 | 
						|
	"github.com/docker/docker/builder/remotecontext/urlutil"
 | 
						|
	"github.com/moby/buildkit/util/gitutil"
 | 
						|
	"github.com/pkg/errors"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// archiveHeaderSize is the number of bytes in an archive header
 | 
						|
	archiveHeaderSize = 512
 | 
						|
	// mobyHostGatewayName defines a special string which users can append to
 | 
						|
	// --add-host to add an extra entry in /etc/hosts that maps
 | 
						|
	// host.docker.internal to the host IP
 | 
						|
	mobyHostGatewayName = "host-gateway"
 | 
						|
)
 | 
						|
 | 
						|
func IsRemoteURL(c string) bool {
 | 
						|
	if urlutil.IsURL(c) {
 | 
						|
		return true
 | 
						|
	}
 | 
						|
	if _, err := gitutil.ParseGitRef(c); err == nil {
 | 
						|
		return true
 | 
						|
	}
 | 
						|
	return false
 | 
						|
}
 | 
						|
 | 
						|
func isLocalDir(c string) bool {
 | 
						|
	st, err := os.Stat(c)
 | 
						|
	return err == nil && st.IsDir()
 | 
						|
}
 | 
						|
 | 
						|
func isArchive(header []byte) bool {
 | 
						|
	for _, m := range [][]byte{
 | 
						|
		{0x42, 0x5A, 0x68},                   // bzip2
 | 
						|
		{0x1F, 0x8B, 0x08},                   // gzip
 | 
						|
		{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}, // xz
 | 
						|
	} {
 | 
						|
		if len(header) < len(m) {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		if bytes.Equal(m, header[:len(m)]) {
 | 
						|
			return true
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	r := tar.NewReader(bytes.NewBuffer(header))
 | 
						|
	_, err := r.Next()
 | 
						|
	return err == nil
 | 
						|
}
 | 
						|
 | 
						|
// toBuildkitExtraHosts converts hosts from docker key:value format to buildkit's csv format
 | 
						|
func toBuildkitExtraHosts(ctx context.Context, inp []string, nodeDriver *driver.DriverHandle) (string, error) {
 | 
						|
	if len(inp) == 0 {
 | 
						|
		return "", nil
 | 
						|
	}
 | 
						|
	hosts := make([]string, 0, len(inp))
 | 
						|
	for _, h := range inp {
 | 
						|
		host, ip, ok := strings.Cut(h, ":")
 | 
						|
		if !ok || host == "" || ip == "" {
 | 
						|
			return "", errors.Errorf("invalid host %s", h)
 | 
						|
		}
 | 
						|
		// If the IP Address is a "host-gateway", replace this value with the
 | 
						|
		// IP address provided by the worker's label.
 | 
						|
		if ip == mobyHostGatewayName {
 | 
						|
			hgip, err := nodeDriver.HostGatewayIP(ctx)
 | 
						|
			if err != nil {
 | 
						|
				return "", errors.Wrap(err, "unable to derive the IP value for host-gateway")
 | 
						|
			}
 | 
						|
			ip = hgip.String()
 | 
						|
		} else if net.ParseIP(ip) == nil {
 | 
						|
			return "", errors.Errorf("invalid host %s", h)
 | 
						|
		}
 | 
						|
		hosts = append(hosts, host+"="+ip)
 | 
						|
	}
 | 
						|
	return strings.Join(hosts, ","), nil
 | 
						|
}
 | 
						|
 | 
						|
// toBuildkitUlimits converts ulimits from docker type=soft:hard format to buildkit's csv format
 | 
						|
func toBuildkitUlimits(inp *opts.UlimitOpt) (string, error) {
 | 
						|
	if inp == nil || len(inp.GetList()) == 0 {
 | 
						|
		return "", nil
 | 
						|
	}
 | 
						|
	ulimits := make([]string, 0, len(inp.GetList()))
 | 
						|
	for _, ulimit := range inp.GetList() {
 | 
						|
		ulimits = append(ulimits, ulimit.String())
 | 
						|
	}
 | 
						|
	return strings.Join(ulimits, ","), nil
 | 
						|
}
 |