Merge pull request #3398 from tonistiigi/gitquerystring-cap-detect
git querystring frontend capability detection
This commit is contained in:
+22
-1
@@ -38,6 +38,7 @@ import (
|
|||||||
"github.com/moby/buildkit/solver/pb"
|
"github.com/moby/buildkit/solver/pb"
|
||||||
"github.com/moby/buildkit/util/apicaps"
|
"github.com/moby/buildkit/util/apicaps"
|
||||||
"github.com/moby/buildkit/util/entitlements"
|
"github.com/moby/buildkit/util/entitlements"
|
||||||
|
"github.com/moby/buildkit/util/gitutil"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/tonistiigi/fsutil"
|
"github.com/tonistiigi/fsutil"
|
||||||
@@ -404,6 +405,7 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
|
|||||||
dockerfileName = inp.DockerfilePath
|
dockerfileName = inp.DockerfilePath
|
||||||
dockerfileSrcName = inp.DockerfilePath
|
dockerfileSrcName = inp.DockerfilePath
|
||||||
toRemove []string
|
toRemove []string
|
||||||
|
caps = map[string]struct{}{}
|
||||||
)
|
)
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
@@ -469,6 +471,12 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
|
|||||||
target.FrontendAttrs["dockerfilekey"] = "dockerfile"
|
target.FrontendAttrs["dockerfilekey"] = "dockerfile"
|
||||||
}
|
}
|
||||||
target.FrontendAttrs["context"] = inp.ContextPath
|
target.FrontendAttrs["context"] = inp.ContextPath
|
||||||
|
|
||||||
|
gitRef, err := gitutil.ParseURL(inp.ContextPath)
|
||||||
|
if err == nil && len(gitRef.Query) > 0 {
|
||||||
|
caps["moby.buildkit.frontend.gitquerystring"] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return nil, errors.Errorf("unable to prepare context: path %q not found", inp.ContextPath)
|
return nil, errors.Errorf("unable to prepare context: path %q not found", inp.ContextPath)
|
||||||
}
|
}
|
||||||
@@ -516,7 +524,7 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
|
|||||||
target.FrontendAttrs["filename"] = dockerfileName
|
target.FrontendAttrs["filename"] = dockerfileName
|
||||||
|
|
||||||
for k, v := range inp.NamedContexts {
|
for k, v := range inp.NamedContexts {
|
||||||
target.FrontendAttrs["frontend.caps"] = "moby.buildkit.frontend.contexts+forward"
|
caps["moby.buildkit.frontend.contexts+forward"] = struct{}{}
|
||||||
if v.State != nil {
|
if v.State != nil {
|
||||||
target.FrontendAttrs["context:"+k] = "input:" + k
|
target.FrontendAttrs["context:"+k] = "input:" + k
|
||||||
if target.FrontendInputs == nil {
|
if target.FrontendInputs == nil {
|
||||||
@@ -528,6 +536,12 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
|
|||||||
|
|
||||||
if IsRemoteURL(v.Path) || strings.HasPrefix(v.Path, "docker-image://") || strings.HasPrefix(v.Path, "target:") {
|
if IsRemoteURL(v.Path) || strings.HasPrefix(v.Path, "docker-image://") || strings.HasPrefix(v.Path, "target:") {
|
||||||
target.FrontendAttrs["context:"+k] = v.Path
|
target.FrontendAttrs["context:"+k] = v.Path
|
||||||
|
gitRef, err := gitutil.ParseURL(v.Path)
|
||||||
|
if err == nil && len(gitRef.Query) > 0 {
|
||||||
|
if _, ok := caps["moby.buildkit.frontend.gitquerystring"]; !ok {
|
||||||
|
caps["moby.buildkit.frontend.gitquerystring+forward"] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,6 +571,7 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
|
|||||||
target.FrontendAttrs["context:"+k] = "oci-layout://" + storeName + ":" + tag + "@" + dig
|
target.FrontendAttrs["context:"+k] = "oci-layout://" + storeName + ":" + tag + "@" + dig
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
st, err := os.Stat(v.Path)
|
st, err := os.Stat(v.Path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to get build context %v", k)
|
return nil, errors.Wrapf(err, "failed to get build context %v", k)
|
||||||
@@ -580,6 +595,12 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp *Inputs, pw pro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(caps) > 0 {
|
||||||
|
keys := slices.Collect(maps.Keys(caps))
|
||||||
|
slices.Sort(keys)
|
||||||
|
target.FrontendAttrs["frontend.caps"] = strings.Join(keys, ",")
|
||||||
|
}
|
||||||
|
|
||||||
inp.DockerfileMappingSrc = dockerfileSrcName
|
inp.DockerfileMappingSrc = dockerfileSrcName
|
||||||
inp.DockerfileMappingDst = dockerfileName
|
inp.DockerfileMappingDst = dockerfileName
|
||||||
return release, nil
|
return release, nil
|
||||||
|
|||||||
@@ -692,6 +692,11 @@ func wrapBuildError(err error, bake bool) error {
|
|||||||
msg += " Named contexts are supported since Dockerfile v1.4. Use #syntax directive in Dockerfile or update to latest BuildKit."
|
msg += " Named contexts are supported since Dockerfile v1.4. Use #syntax directive in Dockerfile or update to latest BuildKit."
|
||||||
return &wrapped{err, msg}
|
return &wrapped{err, msg}
|
||||||
}
|
}
|
||||||
|
if st.Code() == codes.Unimplemented && strings.Contains(st.Message(), "unsupported frontend capability moby.buildkit.frontend.gitquerystring") {
|
||||||
|
msg := "current frontend does not support Git URLs with query string components."
|
||||||
|
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}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user