From ba433abdb664fe5c5da919854c3e715b69573564 Mon Sep 17 00:00:00 2001 From: Alessandro Bitocchi <62668708+Greendor1234@users.noreply.github.com> Date: Tue, 19 Mar 2024 08:24:46 +0100 Subject: [PATCH] Fix COPY fails when multiple files are copied to path specified in ENV (#3034) * Fixed unsolved ENV variable used as dest of COPY * added unit test for copy cmd using env var as dest * remove comment --- pkg/commands/copy_test.go | 64 +++++++++++++++++++++++++++++++++++++++ pkg/util/command_util.go | 1 + 2 files changed, 65 insertions(+) diff --git a/pkg/commands/copy_test.go b/pkg/commands/copy_test.go index 0acbec772..5f967622b 100755 --- a/pkg/commands/copy_test.go +++ b/pkg/commands/copy_test.go @@ -426,6 +426,70 @@ func Test_resolveIfSymlink(t *testing.T) { } } +func Test_CopyEnvAndWildcards(t *testing.T) { + setupDirs := func(t *testing.T) (string, string) { + testDir := t.TempDir() + + dir := filepath.Join(testDir, "bar") + + if err := os.MkdirAll(dir, 0777); err != nil { + t.Fatal(err) + } + file := filepath.Join(dir, "bam.txt") + + if err := os.WriteFile(file, []byte("meow"), 0777); err != nil { + t.Fatal(err) + } + targetPath := filepath.Join(dir, "dam.txt") + if err := os.WriteFile(targetPath, []byte("woof"), 0777); err != nil { + t.Fatal(err) + } + if err := os.Symlink("dam.txt", filepath.Join(dir, "sym.link")); err != nil { + t.Fatal(err) + } + + return testDir, filepath.Base(dir) + } + testDir, srcDir := setupDirs(t) + t.Run("copy sources into a dir defined in env variable", func(t *testing.T) { + defer os.RemoveAll(testDir) + expected, err := readDirectory(filepath.Join(testDir, srcDir)) + if err != nil { + t.Fatal(err) + } + + targetPath := filepath.Join(testDir, "target") + "/" + + cmd := CopyCommand{ + cmd: &instructions.CopyCommand{ + SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir + "/*"}, DestPath: "$TARGET_PATH"}, + }, + fileContext: util.FileContext{Root: testDir}, + } + + cfg := &v1.Config{ + Cmd: nil, + Env: []string{"TARGET_PATH=" + targetPath}, + WorkingDir: testDir, + } + + err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) + if err != nil { + t.Fatal(err) + } + testutil.CheckNoError(t, err) + + actual, err := readDirectory(targetPath) + if err != nil { + t.Fatal(err) + } + for i, f := range actual { + testutil.CheckDeepEqual(t, expected[i].Name(), f.Name()) + testutil.CheckDeepEqual(t, expected[i].Mode(), f.Mode()) + } + }) +} + func TestCopyCommand_ExecuteCommand_Extended(t *testing.T) { setupDirs := func(t *testing.T) (string, string) { testDir := t.TempDir() diff --git a/pkg/util/command_util.go b/pkg/util/command_util.go index 1e84c9bdc..a0a7ca686 100644 --- a/pkg/util/command_util.go +++ b/pkg/util/command_util.go @@ -99,6 +99,7 @@ func ResolveEnvAndWildcards(sd instructions.SourcesAndDest, fileContext FileCont return nil, "", errors.Wrap(err, "failed to resolve environment for dest path") } dest := dests[0] + sd.DestPath = dest // Resolve wildcards and get a list of resolved sources srcs, err := ResolveSources(resolvedEnvs, fileContext.Root) if err != nil {