diff --git a/client/build_test.go b/client/build_test.go index b38e944635b9..ccce44972323 100644 --- a/client/build_test.go +++ b/client/build_test.go @@ -31,6 +31,7 @@ import ( digest "github.com/opencontainers/go-digest" "github.com/pkg/errors" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" "golang.org/x/crypto/ssh/agent" "google.golang.org/grpc/codes" ) @@ -691,9 +692,9 @@ func testClientGatewayContainerMounts(t *testing.T, sb integration.Sandbox) { require.NoError(t, err) defer c.Close() - tmpdir := t.TempDir() + tmpdir := integration.Tmpdir(t) - err = os.WriteFile(filepath.Join(tmpdir, "local-file"), []byte("local"), 0644) + err = os.WriteFile(filepath.Join(tmpdir.Name, "local-file"), []byte("local"), 0644) require.NoError(t, err) a := agent.NewKeyring() @@ -834,7 +835,7 @@ func testClientGatewayContainerMounts(t *testing.T, sb integration.Sandbox) { } _, err = c.Build(ctx, SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": tmpdir, }, Session: []session.Attachable{ diff --git a/client/client_test.go b/client/client_test.go index b434b347c037..3a890beb017f 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -69,6 +69,7 @@ import ( "github.com/pkg/errors" "github.com/spdx/tools-golang/spdx" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" "golang.org/x/crypto/ssh/agent" "golang.org/x/sync/errgroup" "google.golang.org/grpc" @@ -210,6 +211,7 @@ var allTests = []func(t *testing.T, sb integration.Sandbox){ testSnapshotWithMultipleBlobs, testExportLocalNoPlatformSplit, testExportLocalNoPlatformSplitOverwrite, + testSolverOptLocalDirsStillWorks, } func TestIntegration(t *testing.T) { @@ -272,9 +274,9 @@ func testCacheExportCacheKeyLoop(t *testing.T, sb integration.Sandbox) { require.NoError(t, err) defer c.Close() - tmpdir := t.TempDir() + tmpdir := integration.Tmpdir(t) - err = os.WriteFile(filepath.Join(tmpdir, "foo"), []byte("foodata"), 0600) + err = os.WriteFile(filepath.Join(tmpdir.Name, "foo"), []byte("foodata"), 0600) require.NoError(t, err) for _, mode := range []bool{false, true} { @@ -295,11 +297,11 @@ func testCacheExportCacheKeyLoop(t *testing.T, sb integration.Sandbox) { { Type: "local", Attrs: map[string]string{ - "dest": filepath.Join(tmpdir, "cache"), + "dest": filepath.Join(tmpdir.Name, "cache"), }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": tmpdir, }, }, nil) @@ -1515,7 +1517,7 @@ func testLocalSymlinkEscape(t *testing.T, sb integration.Sandbox) { require.NoError(t, err) _, err = c.Solve(sb.Context(), def, SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, }, }, nil) @@ -1554,6 +1556,49 @@ func testRelativeWorkDir(t *testing.T, sb integration.Sandbox) { require.Equal(t, []byte("/test1/test2\n"), dt) } +// TODO: remove this test once `client.SolveOpt.LocalDirs`, now marked as deprecated, is removed. +// For more context on this test, please check: +// https://github.com/moby/buildkit/pull/4583#pullrequestreview-1847043452 +func testSolverOptLocalDirsStillWorks(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") + + c, err := New(sb.Context(), sb.Address()) + require.NoError(t, err) + defer c.Close() + + out := llb.Image("docker.io/library/busybox:latest"). + File(llb.Copy(llb.Local("mylocal"), "input.txt", "input.txt")). + Run(llb.Shlex(`sh -c "/bin/rev < input.txt > /out/output.txt"`)). + AddMount(`/out`, llb.Scratch()) + + def, err := out.Marshal(sb.Context()) + require.NoError(t, err) + + srcDir := integration.Tmpdir(t, + fstest.CreateFile("input.txt", []byte("Hello World"), 0600), + ) + + destDir := integration.Tmpdir(t) + + _, err = c.Solve(sb.Context(), def, SolveOpt{ + LocalDirs: map[string]string{ + "mylocal": srcDir.Name, + }, + Exports: []ExportEntry{ + { + Type: ExporterLocal, + OutputDir: destDir.Name, + }, + }, + }, nil) + + require.NoError(t, err) + + dt, err := os.ReadFile(filepath.Join(destDir.Name, "output.txt")) + require.NoError(t, err) + require.Equal(t, []byte("dlroW olleH"), dt) +} + func testFileOpMkdirMkfile(t *testing.T, sb integration.Sandbox) { requiresLinux(t) c, err := New(sb.Context(), sb.Address()) @@ -1624,7 +1669,7 @@ func testFileOpCopyRm(t *testing.T, sb integration.Sandbox) { OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, "mylocal2": dir2, }, @@ -1751,7 +1796,7 @@ func testFileOpCopyIncludeExclude(t *testing.T, sb integration.Sandbox) { OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, }, }, nil) @@ -1772,7 +1817,7 @@ func testFileOpCopyIncludeExclude(t *testing.T, sb integration.Sandbox) { // Create additional file which doesn't match the include pattern, and make // sure this doesn't invalidate the cache. - err = fstest.Apply(fstest.CreateFile("unmatchedfile", []byte("data1"), 0600)).Apply(dir) + err = fstest.Apply(fstest.CreateFile("unmatchedfile", []byte("data1"), 0600)).Apply(dir.Name) require.NoError(t, err) st = llb.Scratch().File( @@ -1798,7 +1843,7 @@ func testFileOpCopyIncludeExclude(t *testing.T, sb integration.Sandbox) { OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, }, }, nil) @@ -1861,7 +1906,7 @@ func testLocalSourceWithDiffer(t *testing.T, sb integration.Sandbox, d llb.DiffT tv := syscall.NsecToTimespec(time.Now().UnixNano()) - err = syscall.UtimesNano(filepath.Join(dir, "foo"), []syscall.Timespec{tv, tv}) + err = syscall.UtimesNano(filepath.Join(dir.Name, "foo"), []syscall.Timespec{tv, tv}) require.NoError(t, err) st := llb.Local("mylocal"+string(d), llb.Differ(d, false)) @@ -1878,7 +1923,7 @@ func testLocalSourceWithDiffer(t *testing.T, sb integration.Sandbox, d llb.DiffT OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal" + string(d): dir, }, }, nil) @@ -1888,10 +1933,10 @@ func testLocalSourceWithDiffer(t *testing.T, sb integration.Sandbox, d llb.DiffT require.NoError(t, err) require.Equal(t, []byte("foo"), dt) - err = os.WriteFile(filepath.Join(dir, "foo"), []byte("bar"), 0600) + err = os.WriteFile(filepath.Join(dir.Name, "foo"), []byte("bar"), 0600) require.NoError(t, err) - err = syscall.UtimesNano(filepath.Join(dir, "foo"), []syscall.Timespec{tv, tv}) + err = syscall.UtimesNano(filepath.Join(dir.Name, "foo"), []syscall.Timespec{tv, tv}) require.NoError(t, err) _, err = c.Solve(context.TODO(), def, SolveOpt{ @@ -1901,7 +1946,7 @@ func testLocalSourceWithDiffer(t *testing.T, sb integration.Sandbox, d llb.DiffT OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal" + string(d): dir, }, }, nil) @@ -2211,7 +2256,7 @@ func testFileOpRmWildcard(t *testing.T, sb integration.Sandbox) { OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, }, }, nil) @@ -7658,7 +7703,7 @@ func testParallelLocalBuilds(t *testing.T, sb integration.Sandbox) { OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "source": srcDir, }, }, nil) @@ -9713,7 +9758,7 @@ func ensureFileContents(t *testing.T, path, expectedContents string) { func makeSSHAgentSock(t *testing.T, agent agent.Agent) (p string, err error) { tmpDir := integration.Tmpdir(t) - sockPath := filepath.Join(tmpDir, "ssh_auth_sock") + sockPath := filepath.Join(tmpDir.Name, "ssh_auth_sock") l, err := net.Listen("unix", sockPath) if err != nil { diff --git a/cmd/buildctl/build.go b/cmd/buildctl/build.go index 206be8363952..7d3fe8bedc09 100644 --- a/cmd/buildctl/build.go +++ b/cmd/buildctl/build.go @@ -250,7 +250,7 @@ func buildAction(clicontext *cli.Context) error { solveOpt := client.SolveOpt{ Exports: exports, - // LocalDirs is set later + // LocalMounts is set later Frontend: clicontext.String("frontend"), // FrontendAttrs is set later // OCILayouts is set later @@ -267,7 +267,7 @@ func buildAction(clicontext *cli.Context) error { return errors.Wrap(err, "invalid opt") } - solveOpt.LocalDirs, err = build.ParseLocal(clicontext.StringSlice("local")) + solveOpt.LocalMounts, err = build.ParseLocal(clicontext.StringSlice("local")) if err != nil { return errors.Wrap(err, "invalid local") } diff --git a/cmd/buildctl/build/local.go b/cmd/buildctl/build/local.go index 098953d422ab..09a7408eb096 100644 --- a/cmd/buildctl/build/local.go +++ b/cmd/buildctl/build/local.go @@ -1,6 +1,25 @@ package build +import ( + "github.com/pkg/errors" + "github.com/tonistiigi/fsutil" +) + // ParseLocal parses --local -func ParseLocal(locals []string) (map[string]string, error) { - return attrMap(locals) +func ParseLocal(locals []string) (map[string]fsutil.FS, error) { + localDirs, err := attrMap(locals) + if err != nil { + return nil, errors.WithStack(err) + } + + mounts := make(map[string]fsutil.FS, len(localDirs)) + + for k, v := range localDirs { + mounts[k], err = fsutil.NewFS(v) + if err != nil { + return nil, errors.WithStack(err) + } + } + + return mounts, nil } diff --git a/examples/build-using-dockerfile/main.go b/examples/build-using-dockerfile/main.go index 8acfc4e768c2..3de7c60af4c9 100644 --- a/examples/build-using-dockerfile/main.go +++ b/examples/build-using-dockerfile/main.go @@ -16,6 +16,7 @@ import ( "github.com/moby/buildkit/util/progress/progressui" "github.com/pkg/errors" "github.com/sirupsen/logrus" + "github.com/tonistiigi/fsutil" "github.com/urfave/cli" "golang.org/x/sync/errgroup" ) @@ -136,9 +137,15 @@ func newSolveOpt(clicontext *cli.Context, w io.WriteCloser) (*client.SolveOpt, e if file == "" { file = filepath.Join(buildCtx, "Dockerfile") } - localDirs := map[string]string{ - "context": buildCtx, - "dockerfile": filepath.Dir(file), + + cxtLocalMount, err := fsutil.NewFS(buildCtx) + if err != nil { + return nil, errors.New("invalid buildCtx local mount dir") + } + + dockerfileLocalMount, err := fsutil.NewFS(filepath.Dir(file)) + if err != nil { + return nil, errors.New("invalid dockerfile local mount dir") } frontend := "dockerfile.v0" // TODO: use gateway @@ -173,7 +180,10 @@ func newSolveOpt(clicontext *cli.Context, w io.WriteCloser) (*client.SolveOpt, e }, }, }, - LocalDirs: localDirs, + LocalMounts: map[string]fsutil.FS{ + "context": cxtLocalMount, + "dockerfile": dockerfileLocalMount, + }, Frontend: frontend, FrontendAttrs: frontendAttrs, }, nil diff --git a/frontend/dockerfile/dockerfile_addchecksum_test.go b/frontend/dockerfile/dockerfile_addchecksum_test.go index cc1d0c912993..058af87abec0 100644 --- a/frontend/dockerfile/dockerfile_addchecksum_test.go +++ b/frontend/dockerfile/dockerfile_addchecksum_test.go @@ -12,6 +12,7 @@ import ( "github.com/moby/buildkit/util/testutil/integration" digest "github.com/opencontainers/go-digest" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var addChecksumTests = integration.TestFuncs( @@ -50,7 +51,7 @@ ADD --checksum=%s %s /tmp/foo fstest.CreateFile("Dockerfile", dockerfile, 0600), ) _, err := f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -69,7 +70,7 @@ ADD --checksum=${DIGEST} ${LINK} /tmp/foo fstest.CreateFile("Dockerfile", dockerfile, 0600), ) _, err := f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -86,7 +87,7 @@ ADD --checksum=%s %s /tmp/foo fstest.CreateFile("Dockerfile", dockerfile, 0600), ) _, err := f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -103,7 +104,7 @@ ADD --checksum=md5:7e55db001d319a94b0b713529a756623 %s /tmp/foo fstest.CreateFile("Dockerfile", dockerfile, 0600), ) _, err := f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -120,7 +121,7 @@ ADD --checksum=unknown:%s %s /tmp/foo fstest.CreateFile("Dockerfile", dockerfile, 0600), ) _, err := f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -137,7 +138,7 @@ ADD --checksum=%s %s /tmp/foo fstest.CreateFile("Dockerfile", dockerfile, 0600), ) _, err := f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -156,7 +157,7 @@ ADD --checksum=%s foo /tmp/foo fstest.CreateFile("Dockerfile", dockerfile, 0600), ) _, err := f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_addgit_test.go b/frontend/dockerfile/dockerfile_addgit_test.go index d77228ffcdf2..f517ef0dca6f 100644 --- a/frontend/dockerfile/dockerfile_addgit_test.go +++ b/frontend/dockerfile/dockerfile_addgit_test.go @@ -14,6 +14,7 @@ import ( "github.com/moby/buildkit/frontend/dockerui" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var addGitTests = integration.TestFuncs( @@ -90,7 +91,7 @@ RUN cd /buildkit-chowned && \ defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_heredoc_test.go b/frontend/dockerfile/dockerfile_heredoc_test.go index 081446ca7b4b..b4a33b23c183 100644 --- a/frontend/dockerfile/dockerfile_heredoc_test.go +++ b/frontend/dockerfile/dockerfile_heredoc_test.go @@ -13,6 +13,7 @@ import ( "github.com/moby/buildkit/util/testutil/workers" "github.com/pkg/errors" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var hdTests = integration.TestFuncs( @@ -87,7 +88,7 @@ COPY --from=build /dest / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -158,7 +159,7 @@ EOF OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -228,7 +229,7 @@ COPY --from=build /dest /dest OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -276,7 +277,7 @@ COPY --from=build /dest /dest OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -325,7 +326,7 @@ COPY --from=build /dest /dest OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -388,7 +389,7 @@ COPY --from=build /dest / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -478,7 +479,7 @@ COPY --from=build /dest / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -572,7 +573,7 @@ COPY --from=build /dest / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -638,7 +639,7 @@ EOF }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -665,7 +666,7 @@ EOF OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_mount_test.go b/frontend/dockerfile/dockerfile_mount_test.go index eec360c618c0..0f408cc15c0a 100644 --- a/frontend/dockerfile/dockerfile_mount_test.go +++ b/frontend/dockerfile/dockerfile_mount_test.go @@ -11,6 +11,7 @@ import ( "github.com/moby/buildkit/frontend/dockerui" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var mountTests = integration.TestFuncs( @@ -53,7 +54,7 @@ RUN --mount=target=/context [ "$(cat /context/testfile)" == "contents0" ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -81,7 +82,7 @@ RUN [ ! -f /mytmp/foo ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -108,7 +109,7 @@ RUN --mont=target=/mytmp,type=tmpfs /bin/true defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -128,7 +129,7 @@ RUN --mont=target=/mytmp,type=tmpfs /bin/true ) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -148,7 +149,7 @@ RUN --mont=target=/mytmp,type=tmpfs /bin/true ) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -193,7 +194,7 @@ COPY --from=second /unique /unique OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -219,7 +220,7 @@ COPY --from=second /unique /unique OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -250,7 +251,7 @@ RUN --mount=type=cache,target=/mycache,uid=1001,gid=1002,mode=0751 [ "$(stat -c defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -279,7 +280,7 @@ RUN --mount=type=cache,target=/mycache [ -f /mycache/foo ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -308,7 +309,7 @@ RUN --mount=type=cache,target=$SOME_PATH [ -f $SOME_PATH/foo ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -337,7 +338,7 @@ RUN --mount=type=cache,target=/mycache2 [ -f /mycache2/foo ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -371,7 +372,7 @@ RUN --mount=type=$MNT_TYPE2,id=$MNT_ID,target=/whatever [ -f /whatever/foo ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -402,7 +403,7 @@ RUN --mount=type=cache,id=mycache,target=$META_PATH [ -f /tmp/meta/foo ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -433,7 +434,7 @@ RUN --mount=from=$ttt,type=cache,target=/tmp ls defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -471,7 +472,7 @@ COPY --from=base /tmpfssize / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -520,7 +521,7 @@ COPY --from=base /combined.txt / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_outline_test.go b/frontend/dockerfile/dockerfile_outline_test.go index a7bcd21910a4..bdaf555b479a 100644 --- a/frontend/dockerfile/dockerfile_outline_test.go +++ b/frontend/dockerfile/dockerfile_outline_test.go @@ -16,6 +16,7 @@ import ( "github.com/moby/buildkit/util/testutil/workers" "github.com/pkg/errors" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var outlineTests = integration.TestFuncs( @@ -129,7 +130,7 @@ FROM second } _, err = c.Build(sb.Context(), client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, }, "", frontend, nil) @@ -229,7 +230,7 @@ FROM second } _, err = c.Build(sb.Context(), client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, }, "", frontend, nil) @@ -285,7 +286,7 @@ COPY Dockerfile Dockerfile } _, err = c.Build(sb.Context(), client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, }, "", frontend, nil) diff --git a/frontend/dockerfile/dockerfile_parents_test.go b/frontend/dockerfile/dockerfile_parents_test.go index 0c4df2a7f246..4400a27781eb 100644 --- a/frontend/dockerfile/dockerfile_parents_test.go +++ b/frontend/dockerfile/dockerfile_parents_test.go @@ -13,6 +13,7 @@ import ( "github.com/moby/buildkit/frontend/dockerui" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var parentsTests = integration.TestFuncs( @@ -56,7 +57,7 @@ COPY --parents foo1/foo2/ba* . OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_provenance_test.go b/frontend/dockerfile/dockerfile_provenance_test.go index 9684ce0a4699..185515a05ef2 100644 --- a/frontend/dockerfile/dockerfile_provenance_test.go +++ b/frontend/dockerfile/dockerfile_provenance_test.go @@ -38,6 +38,7 @@ import ( ocispecs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) func testProvenanceAttestation(t *testing.T, sb integration.Sandbox) { @@ -80,7 +81,7 @@ RUN echo "ok" > /foo provReq = "mode=" + mode } _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -258,7 +259,7 @@ COPY myapp.Dockerfile / fstest.CreateFile("myapp.Dockerfile", dockerfile, 0600), ) - err = runShell(dir, + err = runShell(dir.Name, "git init", "git config --local user.email test", "git config --local user.name test", @@ -270,11 +271,11 @@ COPY myapp.Dockerfile / require.NoError(t, err) cmd := exec.Command("git", "rev-parse", "v1") - cmd.Dir = dir + cmd.Dir = dir.Name expectedGitSHA, err := cmd.Output() require.NoError(t, err) - server := httptest.NewServer(http.FileServer(http.Dir(filepath.Join(dir)))) + server := httptest.NewServer(http.FileServer(http.Dir(filepath.Join(dir.Name)))) defer server.Close() target := registry + "/buildkit/testwithprovenance:git" @@ -409,7 +410,7 @@ RUN echo "ok-$TARGETARCH" > /foo target := registry + "/buildkit/testmultiprovenance:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -614,7 +615,7 @@ func testClientFrontendProvenance(t *testing.T, sb integration.Sandbox) { }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -761,7 +762,7 @@ func testClientLLBProvenance(t *testing.T, sb integration.Sandbox) { }, }, }, - LocalDirs: map[string]string{}, + LocalMounts: map[string]fsutil.FS{}, }, "", frontend, nil) require.NoError(t, err) @@ -833,7 +834,7 @@ RUN --mount=type=secret,id=mysecret --mount=type=secret,id=othersecret --mount=t target := registry + "/buildkit/testsecretprovenance:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -915,7 +916,7 @@ EOF ) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -955,7 +956,7 @@ EOF ) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1038,7 +1039,7 @@ ENV FOO=bar ) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1077,7 +1078,7 @@ func testDuplicatePlatformProvenance(t *testing.T, sb integration.Sandbox) { "attest:provenance": "mode=max", "platform": "linux/amd64,linux/amd64", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1104,7 +1105,7 @@ func testDockerIgnoreMissingProvenance(t *testing.T, sb integration.Sandbox) { // remove the directory to simulate the case where the context // directory does not exist, and either no validation checks were run, // or they passed erroneously - if err := os.RemoveAll(dirContext); err != nil { + if err := os.RemoveAll(dirContext.Name); err != nil { return nil, err } @@ -1121,7 +1122,7 @@ func testDockerIgnoreMissingProvenance(t *testing.T, sb integration.Sandbox) { FrontendAttrs: map[string]string{ "attest:provenance": "mode=max", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dirDockerfile, dockerui.DefaultLocalNameContext: dirContext, }, @@ -1211,7 +1212,7 @@ COPY bar bar2 ref := identity.NewID() _, err = c.Build(ctx, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1318,7 +1319,7 @@ RUN date +%s > /b.txt target := registry + "/buildkit/testwithprovenance:dup" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_runnetwork_test.go b/frontend/dockerfile/dockerfile_runnetwork_test.go index 1aa1f9d346d1..a2f360cd3f04 100644 --- a/frontend/dockerfile/dockerfile_runnetwork_test.go +++ b/frontend/dockerfile/dockerfile_runnetwork_test.go @@ -14,6 +14,7 @@ import ( "github.com/moby/buildkit/util/testutil/integration" "github.com/moby/buildkit/util/testutil/workers" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var runNetworkTests = integration.TestFuncs( @@ -52,7 +53,7 @@ RUN ip link show eth0 defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -87,7 +88,7 @@ RUN --network=none ! ip link show eth0 defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -127,7 +128,7 @@ RUN --network=host nc 127.0.0.1 %s | grep foo defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -175,7 +176,7 @@ RUN --network=none ! nc -z 127.0.0.1 %s defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_runsecurity_test.go b/frontend/dockerfile/dockerfile_runsecurity_test.go index dac7b85fc150..325a0e1d3651 100644 --- a/frontend/dockerfile/dockerfile_runsecurity_test.go +++ b/frontend/dockerfile/dockerfile_runsecurity_test.go @@ -12,6 +12,7 @@ import ( "github.com/moby/buildkit/util/entitlements" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var runSecurityTests = integration.TestFuncs( @@ -67,7 +68,7 @@ RUN --security=insecure ls -l /dev && dd if=/dev/zero of=disk.img bs=20M count=1 defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -105,7 +106,7 @@ RUN [ "$(cat /proc/self/status | grep CapBnd)" == "CapBnd: 00000000a80425fb" ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -142,7 +143,7 @@ RUN --security=sandbox [ "$(cat /proc/self/status | grep CapBnd)" == "CapBnd: 00 defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -169,7 +170,7 @@ RUN [ "$(cat /proc/self/status | grep CapBnd)" == "CapBnd: 00000000a80425fb" ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_secrets_test.go b/frontend/dockerfile/dockerfile_secrets_test.go index 705642ea41ec..fd72d9b053b1 100644 --- a/frontend/dockerfile/dockerfile_secrets_test.go +++ b/frontend/dockerfile/dockerfile_secrets_test.go @@ -10,6 +10,7 @@ import ( "github.com/moby/buildkit/session/secrets/secretsprovider" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var secretsTests = integration.TestFuncs( @@ -41,7 +42,7 @@ RUN [ ! -f /mysecret ] # check no stub left behind defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -71,7 +72,7 @@ RUN --mount=type=secret,required,id=mysecret foo defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_ssh_test.go b/frontend/dockerfile/dockerfile_ssh_test.go index 1a5bb4fe501a..38efcec2bece 100644 --- a/frontend/dockerfile/dockerfile_ssh_test.go +++ b/frontend/dockerfile/dockerfile_ssh_test.go @@ -19,6 +19,7 @@ import ( "github.com/moby/buildkit/session/sshforward/sshprovider" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var sshTests = integration.TestFuncs( @@ -69,7 +70,7 @@ RUN --mount=type=ssh,mode=741,uid=100,gid=102 [ "$(stat -c "%u %g %f" $SSH_AUTH_ require.NoError(t, err) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -135,7 +136,7 @@ RUN --mount=type=ssh apk update \ require.NoError(t, err) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/dockerfile/dockerfile_targets_test.go b/frontend/dockerfile/dockerfile_targets_test.go index 9390fbe01b63..3ba77eb7173a 100644 --- a/frontend/dockerfile/dockerfile_targets_test.go +++ b/frontend/dockerfile/dockerfile_targets_test.go @@ -16,6 +16,7 @@ import ( "github.com/moby/buildkit/util/testutil/workers" "github.com/pkg/errors" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) var targetsTests = integration.TestFuncs( @@ -114,7 +115,7 @@ FROM second AS binary } _, err = c.Build(sb.Context(), client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, }, "", frontend, nil) @@ -170,7 +171,7 @@ COPY Dockerfile Dockerfile } _, err = c.Build(sb.Context(), client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, }, "", frontend, nil) diff --git a/frontend/dockerfile/dockerfile_test.go b/frontend/dockerfile/dockerfile_test.go index 16199e766c98..b60785d1ba44 100644 --- a/frontend/dockerfile/dockerfile_test.go +++ b/frontend/dockerfile/dockerfile_test.go @@ -23,6 +23,7 @@ import ( "time" v1 "github.com/moby/buildkit/cache/remotecache/v1" + "github.com/tonistiigi/fsutil" "golang.org/x/sync/errgroup" "github.com/containerd/containerd" @@ -302,7 +303,7 @@ echo -n $my_arg $* > /out OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -344,7 +345,7 @@ RUN [ "$myenv" = 'foo%sbar' ] OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -390,7 +391,7 @@ foo defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -401,7 +402,7 @@ foo FrontendAttrs: map[string]string{ "filename": "Dockerfile2", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -431,7 +432,7 @@ RUN [ "$(cat testfile)" == "contents0" ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -473,7 +474,7 @@ COPY --from=base2 /foo /f defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -492,7 +493,7 @@ COPY --from=base2 /foo /f require.NoError(t, err) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -550,7 +551,7 @@ FROM stage-$TARGETOS Output: fixedWriteCloser(&nopWriteCloser{buf}), }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -576,7 +577,7 @@ FROM stage-$TARGETOS FrontendAttrs: map[string]string{ "platform": "linux/amd64,darwin/amd64", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -623,7 +624,7 @@ WORKDIR / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -653,7 +654,7 @@ FROM busybox defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -661,7 +662,7 @@ FROM busybox require.NoError(t, err) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -691,7 +692,7 @@ ENV foo bar defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -774,7 +775,7 @@ RUN e="300:400"; p="/file" ; a=` + "`" + `stat -c "%u:%g defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -785,7 +786,7 @@ RUN e="300:400"; p="/file" ; a=` + "`" + `stat -c "%u:%g FrontendAttrs: map[string]string{ "target": "copy_from", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -827,7 +828,7 @@ COPY --from=base unique / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -837,7 +838,7 @@ COPY --from=base unique / dt, err := os.ReadFile(filepath.Join(destDir, "unique")) require.NoError(t, err) - err = os.WriteFile(filepath.Join(dir, "bar"), []byte("bar-data-mod"), 0600) + err = os.WriteFile(filepath.Join(dir.Name, "bar"), []byte("bar-data-mod"), 0600) require.NoError(t, err) destDir = t.TempDir() @@ -849,7 +850,7 @@ COPY --from=base unique / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -860,7 +861,7 @@ COPY --from=base unique / require.NoError(t, err) require.Equal(t, string(dt), string(dt2)) - err = os.WriteFile(filepath.Join(dir, "foo2"), []byte("foo2-data-mod"), 0600) + err = os.WriteFile(filepath.Join(dir.Name, "foo2"), []byte("foo2-data-mod"), 0600) require.NoError(t, err) destDir = t.TempDir() @@ -872,7 +873,7 @@ COPY --from=base unique / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -912,7 +913,7 @@ COPY foo nomatch* / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -946,7 +947,7 @@ RUN [ "$(stat -c "%U %G" /mydir)" == "user user" ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -979,7 +980,7 @@ FROM target defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1013,7 +1014,7 @@ COPY --from=base Dockerfile . defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1043,7 +1044,7 @@ RUN [ "$(stat -c "%U %G" /mydir)" == "user user" ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1080,7 +1081,7 @@ RUN [ "$(stat -c "%U %G" /dest01)" == "user01 user" ] FrontendAttrs: map[string]string{ "build-arg:group": "user", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1118,7 +1119,7 @@ COPY link/foo . OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1160,7 +1161,7 @@ COPY --from=build /sub2/foo bar OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1200,7 +1201,7 @@ COPY . / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1233,7 +1234,7 @@ RUN ["ls"] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1268,7 +1269,7 @@ COPY --from=build /out . destDir := t.TempDir() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1312,7 +1313,7 @@ COPY --from=build /out . destDir := t.TempDir() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1357,7 +1358,7 @@ COPY Dockerfile . require.NoError(t, err) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1447,7 +1448,7 @@ COPY arch-$TARGETARCH whoami destDir := t.TempDir() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1484,7 +1485,7 @@ COPY arch-$TARGETARCH whoami require.NoError(t, err) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1576,7 +1577,7 @@ COPY foo / defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1597,7 +1598,7 @@ COPY foo / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1629,7 +1630,7 @@ COPY foo / defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1640,7 +1641,7 @@ COPY foo / require.NoError(t, err) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1677,7 +1678,7 @@ COPY foo/sub bar defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1722,7 +1723,7 @@ COPY sub/l* alllinks/ OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1830,7 +1831,7 @@ CMD ["test"] }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1858,7 +1859,7 @@ ENTRYPOINT my entrypoint }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1921,7 +1922,7 @@ LABEL foo=bar }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -1950,7 +1951,7 @@ COPY foo . }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2001,7 +2002,7 @@ COPY foo . OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2035,7 +2036,7 @@ FROM busybox:${tag} FrontendAttrs: map[string]string{ "build-arg:tag": "latest", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2064,7 +2065,7 @@ func testDockerfileDirs(t *testing.T, sb integration.Sandbox) { fstest.CreateFile("foo", []byte("bar"), 0600), ) - args, trace := f.DFCmdArgs(dir, dir) + args, trace := f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) cmd := sb.Cmd(args) @@ -2078,7 +2079,7 @@ func testDockerfileDirs(t *testing.T, sb integration.Sandbox) { defer os.RemoveAll(trace) cmd = sb.Cmd(args) - cmd.Dir = dir + cmd.Dir = dir.Name require.NoError(t, cmd.Run()) _, err = os.Stat(trace) @@ -2095,11 +2096,11 @@ func testDockerfileDirs(t *testing.T, sb integration.Sandbox) { fstest.CreateFile("foo", []byte("bar"), 0600), ) - args, trace = f.DFCmdArgs(dir2, dir1) + args, trace = f.DFCmdArgs(dir2.Name, dir1.Name) defer os.RemoveAll(trace) cmd = sb.Cmd(args) - cmd.Dir = dir + cmd.Dir = dir.Name require.NoError(t, cmd.Run()) _, err = os.Stat(trace) @@ -2123,7 +2124,7 @@ func testDockerfileInvalidCommand(t *testing.T, sb integration.Sandbox) { fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - args, trace := f.DFCmdArgs(dir, dir) + args, trace := f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) cmd := sb.Cmd(args) @@ -2154,7 +2155,7 @@ func testDockerfileInvalidInstruction(t *testing.T, sb integration.Sandbox) { defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2199,7 +2200,7 @@ ADD %s /dest/ fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - args, trace := f.DFCmdArgs(dir, dir) + args, trace := f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir := t.TempDir() @@ -2223,7 +2224,7 @@ ADD %s /dest/ fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - args, trace = f.DFCmdArgs(dir, dir) + args, trace = f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir = t.TempDir() @@ -2273,7 +2274,7 @@ ADD t.tar / fstest.CreateFile("t.tar", buf.Bytes(), 0600), ) - args, trace := f.DFCmdArgs(dir, dir) + args, trace := f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir := t.TempDir() @@ -2304,7 +2305,7 @@ ADD t.tar.gz / fstest.CreateFile("t.tar.gz", buf2.Bytes(), 0600), ) - args, trace = f.DFCmdArgs(dir, dir) + args, trace = f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir = t.TempDir() @@ -2328,7 +2329,7 @@ COPY t.tar.gz / fstest.CreateFile("t.tar.gz", buf2.Bytes(), 0600), ) - args, trace = f.DFCmdArgs(dir, dir) + args, trace = f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir = t.TempDir() @@ -2361,7 +2362,7 @@ ADD %s / fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - args, trace = f.DFCmdArgs(dir, dir) + args, trace = f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir = t.TempDir() @@ -2384,7 +2385,7 @@ ADD %s /newname.tar.gz fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - args, trace = f.DFCmdArgs(dir, dir) + args, trace = f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir = t.TempDir() @@ -2456,7 +2457,7 @@ ADD *.tar /dest OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2498,7 +2499,7 @@ RUN [ "$(stat -c "%u %G" /foo)" == "1000 nobody" ] FrontendAttrs: map[string]string{ "build-arg:group": "nobody", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2537,7 +2538,7 @@ COPY foo /symlink/ fstest.CreateFile("t.tar", buf.Bytes(), 0600), ) - args, trace := f.DFCmdArgs(dir, dir) + args, trace := f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) destDir := t.TempDir() @@ -2569,7 +2570,7 @@ ENV foo=bar fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - args, trace := f.DFCmdArgs(dir, dir) + args, trace := f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) target := "example.com/moby/dockerfilescratch:test" @@ -2648,7 +2649,7 @@ EXPOSE 5000 }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2732,7 +2733,7 @@ Dockerfile OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2788,7 +2789,7 @@ COPY . . defer c.Close() _, err = f.Solve(ctx, c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2822,7 +2823,7 @@ func testDockerfileLowercase(t *testing.T, sb integration.Sandbox) { defer c.Close() _, err = f.Solve(ctx, c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -2854,7 +2855,7 @@ RUN ["ls"] fstest.CreateFile("foo", []byte("contents0"), 0600), ) - args, trace := f.DFCmdArgs(dir, dir) + args, trace := f.DFCmdArgs(dir.Name, dir.Name) defer os.RemoveAll(trace) workers.CheckFeatureCompat(t, sb, workers.FeatureImageExporter) @@ -2993,7 +2994,7 @@ USER nobody OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3019,7 +3020,7 @@ USER nobody }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3082,7 +3083,7 @@ RUN [ "$(id)" = "uid=1(daemon) gid=1(daemon) groups=1(daemon)" ] defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3135,7 +3136,7 @@ COPY --from=base /out / FrontendAttrs: map[string]string{ "build-arg:group": "nobody", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3194,7 +3195,7 @@ COPY --from=base /out / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3252,7 +3253,7 @@ COPY files dest OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3297,7 +3298,7 @@ COPY $FOO baz OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3350,7 +3351,7 @@ COPY sub/dir1 subdest6 OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3437,7 +3438,7 @@ RUN sh -c "[ $(cat /test5/foo) = 'hello' ]" defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3490,7 +3491,7 @@ COPY --from=build /dest /dest OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3686,7 +3687,7 @@ COPY --from=busybox /etc/passwd test OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3720,7 +3721,7 @@ COPY --from=golang /usr/bin/go go OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3763,7 +3764,7 @@ COPY --from=stage1 baz bax OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3809,7 +3810,7 @@ LABEL foo=bar }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3870,19 +3871,19 @@ RUN ls /files/file1 defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, }, nil) require.NoError(t, err) - err = os.Rename(filepath.Join(dir, "file1"), filepath.Join(dir, "file2")) + err = os.Rename(filepath.Join(dir.Name, "file1"), filepath.Join(dir.Name, "file2")) require.NoError(t, err) // cache should be invalidated and build should fail _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3927,7 +3928,7 @@ ONBUILD RUN mkdir -p /out && echo -n 11 >> /out/foo }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3955,7 +3956,7 @@ ONBUILD RUN mkdir -p /out && echo -n 11 >> /out/foo }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -3981,7 +3982,7 @@ ONBUILD RUN mkdir -p /out && echo -n 11 >> /out/foo OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4058,7 +4059,7 @@ COPY --from=base arch / FrontendAttrs: map[string]string{ "platform": "linux/amd64,linux/arm/v7", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4096,7 +4097,7 @@ COPY --from=base arch / }, }, CacheExports: exportCache, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4173,7 +4174,7 @@ COPY --from=base unique / }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4209,7 +4210,7 @@ COPY --from=base unique / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4272,7 +4273,7 @@ COPY --from=base unique / Attrs: map[string]string{"ref": target}, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4300,7 +4301,7 @@ COPY --from=base unique / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4348,7 +4349,7 @@ RUN echo bar > bar }, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4432,7 +4433,7 @@ RUN echo bar > bar Attrs: map[string]string{"ref": cacheTarget}, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4501,7 +4502,7 @@ COPY --from=s1 unique2 / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4582,7 +4583,7 @@ COPY foo2 bar2 OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4635,7 +4636,7 @@ COPY --from=build out . "platform": "darwin/ppc64le", "build-arg:TARGETOS": "freebsd", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4690,7 +4691,7 @@ COPY --from=build /out / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4717,7 +4718,7 @@ COPY --from=build /out / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4744,7 +4745,7 @@ COPY --from=build /out / OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4854,7 +4855,7 @@ COPY foo bar "contextsubdir": "sub/dir", }, Session: []session.Attachable{up}, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, Exports: []client.ExportEntry{ @@ -4928,7 +4929,7 @@ COPY foo foo2 OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -4973,7 +4974,7 @@ COPY badfile / _, err = c.Build(sb.Context(), client.SolveOpt{ Exports: []client.ExportEntry{}, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5028,7 +5029,7 @@ COPY foo foo2 OutputDir: destDir, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, FrontendInputs: map[string]llb.State{ @@ -5112,7 +5113,7 @@ COPY Dockerfile Dockerfile } _, err = c.Build(sb.Context(), client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, }, }, "", frontend, nil) @@ -5170,7 +5171,7 @@ RUN echo $(hostname) | grep foo t.Run(tt.name, func(t *testing.T) { _, err = f.Solve(sb.Context(), c, client.SolveOpt{ FrontendAttrs: tt.attrs, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5205,7 +5206,7 @@ COPY --from=base /shmsize / FrontendAttrs: map[string]string{ "shm-size": "134217728", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5248,7 +5249,7 @@ COPY --from=base /ulimit / FrontendAttrs: map[string]string{ "ulimit": "nofile=1062:1062", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5312,7 +5313,7 @@ COPY --from=base /out / FrontendAttrs: map[string]string{ "cgroup-parent": cgroupName, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5364,7 +5365,7 @@ COPY --from=base /out / // Make sure image resolution works as expected, do not add a tag or locator. "context:busybox": "docker-image://alpine", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5403,7 +5404,7 @@ ENV FOOBAR=foobar target := registry + "/buildkit/testnamedimagecontext:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5443,7 +5444,7 @@ COPY --from=base /env_foobar / FrontendAttrs: map[string]string{ "context:busybox": "docker-image://" + target, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5499,7 +5500,7 @@ func testNamedImageContextPlatform(t *testing.T, sb integration.Sandbox) { FrontendAttrs: map[string]string{ "build-arg:BUILDKIT_MULTI_PLATFORM": "true", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5534,7 +5535,7 @@ RUN echo hello // here we specifically want to make sure that the platform chosen for the image source is the one in the dockerfile not the target platform. "platform": "darwin/ppc64le", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5570,7 +5571,7 @@ RUN echo foo >> /test target := registry + "/buildkit/testnamedimagecontexttimestamps:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5601,7 +5602,7 @@ RUN echo foo >> /test FrontendAttrs: map[string]string{ "context:alpine": "docker-image://" + target, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dirDerived, dockerui.DefaultLocalNameContext: dirDerived, }, @@ -5656,7 +5657,7 @@ EOF FrontendAttrs: map[string]string{ "context:busybox": "docker-image://scratch", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5716,7 +5717,7 @@ COPY --from=base /o* / FrontendAttrs: map[string]string{ "context:base": "local:basedir", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, "basedir": dir2, @@ -5773,7 +5774,7 @@ func testNamedOCILayoutContext(t *testing.T, sb integration.Sandbox) { outW := bytes.NewBuffer(nil) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: inDir, dockerui.DefaultLocalNameContext: inDir, }, @@ -5844,7 +5845,7 @@ COPY --from=imported /test/outfoo / "context:base": fmt.Sprintf("oci-layout:%s@sha256:%s", ociID, digest), "context:foo": fmt.Sprintf("oci-layout:%s@sha256:%s", ociID, digest), }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5901,7 +5902,7 @@ ENV foo=bar outW := bytes.NewBuffer(nil) _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -5952,7 +5953,7 @@ FROM nonexistent AS base FrontendAttrs: map[string]string{ "context:nonexistent": fmt.Sprintf("oci-layout:%s@sha256:%s", ociID, digest), }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6072,7 +6073,7 @@ COPY --from=build /foo /out / destDir := t.TempDir() _, err = c.Build(ctx, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, dockerui.DefaultLocalNameDockerfile + "2": dir2, @@ -6211,7 +6212,7 @@ COPY --from=build /foo /out / destDir := t.TempDir() _, err = c.Build(ctx, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, dockerui.DefaultLocalNameDockerfile + "2": dir2, @@ -6275,7 +6276,7 @@ func testNamedFilteredContext(t *testing.T, sb integration.Sandbox) { "context:foo": "local:foo", "target": target, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, "foo": fooDir, @@ -6385,7 +6386,7 @@ COPY Dockerfile . FrontendAttrs: map[string]string{ "build-arg:SOURCE_DATE_EPOCH": fmt.Sprintf("%d", tm.Unix()), }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6464,7 +6465,7 @@ CMD sh /scan.sh scannerTarget := registry + "/buildkit/testsbomscanner:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: scannerDir, dockerui.DefaultLocalNameContext: scannerDir, }, @@ -6493,7 +6494,7 @@ EOF target := registry + "/buildkit/testsbomscannertarget:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6581,7 +6582,7 @@ CMD sh /scan.sh scannerTarget := registry + "/buildkit/testsbomscannerargs:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: scannerDir, dockerui.DefaultLocalNameContext: scannerDir, }, @@ -6612,7 +6613,7 @@ FROM base target := registry + "/buildkit/testsbomscannerargstarget1:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6677,7 +6678,7 @@ ARG BUILDKIT_SBOM_SCAN_STAGE=true // scan an image with additional sboms target = registry + "/buildkit/testsbomscannertarget2:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6725,7 +6726,7 @@ ARG BUILDKIT_SBOM_SCAN_STAGE=true // scan an image with additional sboms, but disable them target = registry + "/buildkit/testsbomscannertarget3:latest" _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6776,7 +6777,6 @@ COPY Dockerfile \ t, fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - defer os.RemoveAll(dir) c, err := client.New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -6807,7 +6807,7 @@ COPY Dockerfile \ FrontendAttrs: map[string]string{ "platform": "linux/amd64,linux/arm64", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6871,7 +6871,6 @@ RUN rm -f /foo-2030.1 t, fstest.CreateFile("Dockerfile", dockerfile, 0600), ) - defer os.RemoveAll(dir) ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -6884,7 +6883,7 @@ RUN rm -f /foo-2030.1 "build-arg:SOURCE_DATE_EPOCH": fmt.Sprintf("%d", tm.Unix()), "platform": "linux/amd64", }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, @@ -6998,25 +6997,25 @@ COPY test+aou.txt / Exports: []client.ExportEntry{ { Type: client.ExporterLocal, - OutputDir: destDir, + OutputDir: destDir.Name, }, }, - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, }, nil) require.NoError(t, err) - dt, err := os.ReadFile(filepath.Join(destDir, "test-äöü.txt")) + dt, err := os.ReadFile(filepath.Join(destDir.Name, "test-äöü.txt")) require.NoError(t, err) require.Equal(t, "foo", string(dt)) - dt, err = os.ReadFile(filepath.Join(destDir, "test-%C3%A4%C3%B6%C3%BC.txt")) + dt, err = os.ReadFile(filepath.Join(destDir.Name, "test-%C3%A4%C3%B6%C3%BC.txt")) require.NoError(t, err) require.Equal(t, "bar", string(dt)) - dt, err = os.ReadFile(filepath.Join(destDir, "test+aou.txt")) + dt, err = os.ReadFile(filepath.Join(destDir.Name, "test+aou.txt")) require.NoError(t, err) require.Equal(t, "baz", string(dt)) } diff --git a/frontend/dockerfile/errors_test.go b/frontend/dockerfile/errors_test.go index 26680466d031..9a8fd7739d2b 100644 --- a/frontend/dockerfile/errors_test.go +++ b/frontend/dockerfile/errors_test.go @@ -10,6 +10,7 @@ import ( "github.com/moby/buildkit/solver/errdefs" "github.com/moby/buildkit/util/testutil/integration" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" ) func testErrorsSourceMap(t *testing.T, sb integration.Sandbox) { @@ -86,7 +87,7 @@ env bar=baz`, defer c.Close() _, err = f.Solve(sb.Context(), c, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ dockerui.DefaultLocalNameDockerfile: dir, dockerui.DefaultLocalNameContext: dir, }, diff --git a/frontend/frontend_test.go b/frontend/frontend_test.go index 3218b56eab1e..cc31d5788047 100644 --- a/frontend/frontend_test.go +++ b/frontend/frontend_test.go @@ -117,7 +117,7 @@ func testRefReadFile(t *testing.T, sb integration.Sandbox) { } _, err = c.Build(ctx, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, }, }, "", frontend, nil) @@ -144,7 +144,7 @@ func testRefReadDir(t *testing.T, sb integration.Sandbox) { expMap := make(map[string]*fstypes.Stat) - fsutil.Walk(ctx, dir, nil, func(path string, info os.FileInfo, err error) error { + fsutil.Walk(ctx, dir.Name, nil, func(path string, info os.FileInfo, err error) error { require.NoError(t, err) stat, ok := info.Sys().(*fstypes.Stat) require.True(t, ok) @@ -233,7 +233,7 @@ func testRefReadDir(t *testing.T, sb integration.Sandbox) { } _, err = c.Build(ctx, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, }, }, "", frontend, nil) @@ -255,7 +255,7 @@ func testRefStatFile(t *testing.T, sb integration.Sandbox) { fstest.CreateFile("test", testcontent, 0666), ) - exp, err := fsutil.Stat(filepath.Join(dir, "test")) + exp, err := fsutil.Stat(filepath.Join(dir.Name, "test")) require.NoError(t, err) frontend := func(ctx context.Context, c gateway.Client) (*gateway.Result, error) { @@ -286,7 +286,7 @@ func testRefStatFile(t *testing.T, sb integration.Sandbox) { } _, err = c.Build(ctx, client.SolveOpt{ - LocalDirs: map[string]string{ + LocalMounts: map[string]fsutil.FS{ "mylocal": dir, }, }, "", frontend, nil) diff --git a/solver/jobs_test.go b/solver/jobs_test.go index 35b84bb69fa1..a427c106805b 100644 --- a/solver/jobs_test.go +++ b/solver/jobs_test.go @@ -9,6 +9,7 @@ import ( "github.com/moby/buildkit/util/testutil/integration" "github.com/moby/buildkit/util/testutil/workers" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" "golang.org/x/sync/errgroup" ) @@ -63,7 +64,7 @@ func testParallelism(t *testing.T, sb integration.Sandbox) { timeStart := time.Now() eg, egCtx := errgroup.WithContext(ctx) solveOpt := client.SolveOpt{ - LocalDirs: map[string]string{"cache": t.TempDir()}, + LocalMounts: map[string]fsutil.FS{"cache": integration.Tmpdir(t)}, } eg.Go(func() error { _, err := c.Solve(egCtx, d1, solveOpt, nil) diff --git a/util/testutil/integration/util.go b/util/testutil/integration/util.go index 85b52b572ce8..8ee29a962b11 100644 --- a/util/testutil/integration/util.go +++ b/util/testutil/integration/util.go @@ -16,12 +16,23 @@ import ( "github.com/containerd/continuity/fs/fstest" "github.com/pkg/errors" "github.com/stretchr/testify/require" + "github.com/tonistiigi/fsutil" "golang.org/x/sync/errgroup" ) var ErrRequirements = errors.Errorf("missing requirements") -func Tmpdir(t *testing.T, appliers ...fstest.Applier) string { +type TmpDirWithName struct { + fsutil.FS + Name string +} + +// This allows TmpDirWithName to continue being used with the `%s` 'verb' on Printf. +func (d *TmpDirWithName) String() string { + return d.Name +} + +func Tmpdir(t *testing.T, appliers ...fstest.Applier) *TmpDirWithName { t.Helper() // We cannot use t.TempDir() to create a temporary directory here because @@ -38,7 +49,10 @@ func Tmpdir(t *testing.T, appliers ...fstest.Applier) string { err = fstest.Apply(appliers...).Apply(tmpdir) require.NoError(t, err) - return tmpdir + mount, err := fsutil.NewFS(tmpdir) + require.NoError(t, err) + + return &TmpDirWithName{FS: mount, Name: tmpdir} } func RunCmd(cmd *exec.Cmd, logs map[string]*bytes.Buffer) error {