diff --git a/build/opt.go b/build/opt.go index 2e4e7b99410a..3214700211f4 100644 --- a/build/opt.go +++ b/build/opt.go @@ -1120,19 +1120,20 @@ func createTempDockerfile(r io.Reader, multiReader *SyncMultiReader) (string, er } func processGitURL(url string, name string, target *client.SolveOpt, caps map[string]struct{}) error { - gitRef, err := gitutil.ParseURL(url) + gitURL, err := gitutil.ParseURL(url) if err != nil { return err } - if len(gitRef.Query) == 0 { + if len(gitURL.Query) == 0 { return nil } + if gitRef, ok, err := dfgitutil.ParseGitRef(url); err != nil && ok { + return err + } else if ok && gitRef.FetchByCommit { + addFrontendCap(caps, "moby.buildkit.frontend.gitfetchbycommit", name) + } if !sendGitQueryAsInput() { - capName := "moby.buildkit.frontend.gitquerystring" - if name != "context" { - capName += "+forward" - } - caps[capName] = struct{}{} + addFrontendCap(caps, "moby.buildkit.frontend.gitquerystring", name) return nil } @@ -1170,6 +1171,13 @@ func processGitURL(url string, name string, target *client.SolveOpt, caps map[st return nil } +func addFrontendCap(caps map[string]struct{}, capName, name string) { + if name != "context" { + capName += "+forward" + } + caps[capName] = struct{}{} +} + // handle https://github.com/moby/moby/pull/10858 func handleLowercaseDockerfile(dir, p string) string { if filepath.Base(p) != "Dockerfile" { diff --git a/commands/build.go b/commands/build.go index 455d8143e1e8..6a93386cee6c 100644 --- a/commands/build.go +++ b/commands/build.go @@ -731,6 +731,11 @@ func wrapBuildError(err error, bake bool) error { msg += " Git URLs with query string are supported since Dockerfile v1.18 and BuildKit v0.24. Use BUILDKIT_SYNTAX build-arg, #syntax directive in Dockerfile or update to latest BuildKit." return &wrapped{err, msg} } + if st.Code() == codes.Unimplemented && strings.Contains(st.Message(), "unsupported frontend capability moby.buildkit.frontend.gitfetchbycommit") { + msg := "current frontend does not support Git URLs with fetch-by-commit query attribute." + msg += " Git URLs with fetch-by-commit with query attribute are supported since Dockerfile v1.24 and BuildKit v0.30. Use BUILDKIT_SYNTAX build-arg, #syntax directive in Dockerfile or update to latest BuildKit." + return &wrapped{err, msg} + } } return err }