From 49d46e71dee928ea77eb6893c9ede389a1b7465f Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Fri, 2 Dec 2022 13:47:19 +0100 Subject: [PATCH] build: skip "host-gateway" validation with moby driver Signed-off-by: CrazyMax --- build/build.go | 2 +- build/utils.go | 25 ++++++++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/build/build.go b/build/build.go index e5d3b28d780..9cf2bc54fe3 100644 --- a/build/build.go +++ b/build/build.go @@ -615,7 +615,7 @@ func toSolveOpt(ctx context.Context, di DriverInfo, multiDriver bool, opt Option } // setup extrahosts - extraHosts, err := toBuildkitExtraHosts(opt.ExtraHosts) + extraHosts, err := toBuildkitExtraHosts(opt.ExtraHosts, d.IsMobyDriver()) if err != nil { return nil, nil, err } diff --git a/build/utils.go b/build/utils.go index 80a97655355..58a9a2cd3aa 100644 --- a/build/utils.go +++ b/build/utils.go @@ -11,8 +11,14 @@ import ( "github.com/pkg/errors" ) -// archiveHeaderSize is the number of bytes in an archive header -const archiveHeaderSize = 512 +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 isLocalDir(c string) bool { st, err := os.Stat(c) @@ -39,18 +45,23 @@ func isArchive(header []byte) bool { } // toBuildkitExtraHosts converts hosts from docker key:value format to buildkit's csv format -func toBuildkitExtraHosts(inp []string) (string, error) { +func toBuildkitExtraHosts(inp []string, mobyDriver bool) (string, error) { if len(inp) == 0 { return "", nil } hosts := make([]string, 0, len(inp)) for _, h := range inp { - parts := strings.Split(h, ":") - - if len(parts) != 2 || parts[0] == "" || net.ParseIP(parts[1]) == nil { + host, ip, ok := strings.Cut(h, ":") + if !ok || host == "" || ip == "" { return "", errors.Errorf("invalid host %s", h) } - hosts = append(hosts, parts[0]+"="+parts[1]) + // Skip IP address validation for "host-gateway" string with moby driver + if !mobyDriver || ip != mobyHostGatewayName { + if net.ParseIP(ip) == nil { + return "", errors.Errorf("invalid host %s", h) + } + } + hosts = append(hosts, host+"="+ip) } return strings.Join(hosts, ","), nil }