From 562a9a965b41167897d9a6814f6d7c282064df4d Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Sat, 10 Feb 2024 11:18:24 +0100 Subject: [PATCH] chore: switch to LocalMounts implementation Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- build/build.go | 32 ++++++++++++++++++++++++++------ build/fs.go | 21 +++++++++++++++++++++ build/git.go | 3 ++- build/git_test.go | 22 ++++++++++++++++------ go.mod | 2 +- 5 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 build/fs.go diff --git a/build/build.go b/build/build.go index 2ae0fbd8e783..aacd445de89b 100644 --- a/build/build.go +++ b/build/build.go @@ -55,6 +55,7 @@ import ( specs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" "github.com/sirupsen/logrus" + "github.com/tonistiigi/fsutil" "go.opentelemetry.io/otel/trace" "golang.org/x/sync/errgroup" ) @@ -220,7 +221,7 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op Ref: opt.Ref, Frontend: "dockerfile.v0", FrontendAttrs: map[string]string{}, - LocalDirs: map[string]string{}, + LocalMounts: map[string]fsutil.FS{}, CacheExports: cacheTo, CacheImports: cacheFrom, AllowedEntitlements: opt.Allow, @@ -385,7 +386,8 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op } defers = append(defers, releaseLoad) - if sharedKey := so.LocalDirs["context"]; sharedKey != "" { + if lm, ok := so.LocalMounts["context"]; ok { + sharedKey := lm.(fs).root if p, err := filepath.Abs(sharedKey); err == nil { sharedKey = filepath.Base(p) } @@ -1145,11 +1147,20 @@ func LoadInputs(ctx context.Context, d *driver.DriverHandle, inp Inputs, pw prog dockerfileReader = buf inp.ContextPath, _ = os.MkdirTemp("", "empty-dir") toRemove = append(toRemove, inp.ContextPath) - target.LocalDirs["context"] = inp.ContextPath + lm, err := newFS(inp.ContextPath) + if err != nil { + return nil, err + } else { + target.LocalMounts["context"] = lm + } } } case isLocalDir(inp.ContextPath): - target.LocalDirs["context"] = inp.ContextPath + lm, err := newFS(inp.ContextPath) + if err != nil { + return nil, err + } + target.LocalMounts["context"] = lm switch inp.DockerfilePath { case "-": dockerfileReader = inp.InStream @@ -1201,7 +1212,11 @@ func LoadInputs(ctx context.Context, d *driver.DriverHandle, inp Inputs, pw prog } if dockerfileDir != "" { - target.LocalDirs["dockerfile"] = dockerfileDir + lm, err := newFS(dockerfileDir) + if err != nil { + return nil, err + } + target.LocalMounts["dockerfile"] = lm dockerfileName = handleLowercaseDockerfile(dockerfileDir, dockerfileName) } @@ -1296,7 +1311,12 @@ func LoadInputs(ctx context.Context, d *driver.DriverHandle, inp Inputs, pw prog if k == "context" || k == "dockerfile" { localName = "_" + k // underscore to avoid collisions } - target.LocalDirs[localName] = v.Path + lm, err := newFS(v.Path) + if err != nil { + return nil, err + } else { + target.LocalMounts[localName] = lm + } target.FrontendAttrs["context:"+k] = "local:" + localName } diff --git a/build/fs.go b/build/fs.go new file mode 100644 index 000000000000..0ad793e258cb --- /dev/null +++ b/build/fs.go @@ -0,0 +1,21 @@ +package build + +import ( + "github.com/tonistiigi/fsutil" +) + +type fs struct { + fsutil.FS + root string +} + +func newFS(root string) (fs, error) { + f, err := fsutil.NewFS(root) + if err != nil { + return fs{}, err + } + return fs{ + FS: f, + root: root, + }, nil +} diff --git a/build/git.go b/build/git.go index 8ed0d00e874a..79c3ba056db6 100644 --- a/build/git.go +++ b/build/git.go @@ -115,7 +115,8 @@ func getGitAttributes(ctx context.Context, contextPath string, dockerfilePath st if !setGitInfo || root == "" { return } - for k, dir := range so.LocalDirs { + for k, lm := range so.LocalMounts { + dir := lm.(fs).root dir, err = filepath.EvalSymlinks(dir) if err != nil { continue diff --git a/build/git_test.go b/build/git_test.go index da954ddbb304..85ba7e4c4d3f 100644 --- a/build/git_test.go +++ b/build/git_test.go @@ -13,6 +13,7 @@ import ( specs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) func setupTest(tb testing.TB) { @@ -159,11 +160,14 @@ func TestGetGitAttributesDirty(t *testing.T) { func TestLocalDirs(t *testing.T) { setupTest(t) + wdfs, err := newFS(".") + require.NoError(t, err) + so := &client.SolveOpt{ FrontendAttrs: map[string]string{}, - LocalDirs: map[string]string{ - "context": ".", - "dockerfile": ".", + LocalMounts: map[string]fsutil.FS{ + "context": wdfs, + "dockerfile": wdfs, }, } @@ -193,11 +197,17 @@ func TestLocalDirsSub(t *testing.T) { gitutil.GitCommit(c, t, "initial commit") gitutil.GitSetRemote(c, t, "origin", "git@github.com:docker/buildx.git") + ctxfs, err := newFS(".") + require.NoError(t, err) + + dockerfilefs, err := newFS("app") + require.NoError(t, err) + so := &client.SolveOpt{ FrontendAttrs: map[string]string{}, - LocalDirs: map[string]string{ - "context": ".", - "dockerfile": "app", + LocalMounts: map[string]fsutil.FS{ + "context": ctxfs, + "dockerfile": dockerfilefs, }, } diff --git a/go.mod b/go.mod index e48edb2d66fc..50deb4892a15 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 + github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 github.com/zclconf/go-cty v1.14.1 go.opentelemetry.io/otel v1.19.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 @@ -137,7 +138,6 @@ require ( github.com/secure-systems-lab/go-securesystemslib v0.4.0 // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect github.com/theupdateframework/notary v0.7.0 // indirect - github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 // indirect github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect