Skip to content
This repository was archived by the owner on Jun 3, 2025. It is now read-only.

Commit ba433ab

Browse files
authored
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
1 parent 8148159 commit ba433ab

2 files changed

Lines changed: 65 additions & 0 deletions

File tree

pkg/commands/copy_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,70 @@ func Test_resolveIfSymlink(t *testing.T) {
426426
}
427427
}
428428

429+
func Test_CopyEnvAndWildcards(t *testing.T) {
430+
setupDirs := func(t *testing.T) (string, string) {
431+
testDir := t.TempDir()
432+
433+
dir := filepath.Join(testDir, "bar")
434+
435+
if err := os.MkdirAll(dir, 0777); err != nil {
436+
t.Fatal(err)
437+
}
438+
file := filepath.Join(dir, "bam.txt")
439+
440+
if err := os.WriteFile(file, []byte("meow"), 0777); err != nil {
441+
t.Fatal(err)
442+
}
443+
targetPath := filepath.Join(dir, "dam.txt")
444+
if err := os.WriteFile(targetPath, []byte("woof"), 0777); err != nil {
445+
t.Fatal(err)
446+
}
447+
if err := os.Symlink("dam.txt", filepath.Join(dir, "sym.link")); err != nil {
448+
t.Fatal(err)
449+
}
450+
451+
return testDir, filepath.Base(dir)
452+
}
453+
testDir, srcDir := setupDirs(t)
454+
t.Run("copy sources into a dir defined in env variable", func(t *testing.T) {
455+
defer os.RemoveAll(testDir)
456+
expected, err := readDirectory(filepath.Join(testDir, srcDir))
457+
if err != nil {
458+
t.Fatal(err)
459+
}
460+
461+
targetPath := filepath.Join(testDir, "target") + "/"
462+
463+
cmd := CopyCommand{
464+
cmd: &instructions.CopyCommand{
465+
SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir + "/*"}, DestPath: "$TARGET_PATH"},
466+
},
467+
fileContext: util.FileContext{Root: testDir},
468+
}
469+
470+
cfg := &v1.Config{
471+
Cmd: nil,
472+
Env: []string{"TARGET_PATH=" + targetPath},
473+
WorkingDir: testDir,
474+
}
475+
476+
err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))
477+
if err != nil {
478+
t.Fatal(err)
479+
}
480+
testutil.CheckNoError(t, err)
481+
482+
actual, err := readDirectory(targetPath)
483+
if err != nil {
484+
t.Fatal(err)
485+
}
486+
for i, f := range actual {
487+
testutil.CheckDeepEqual(t, expected[i].Name(), f.Name())
488+
testutil.CheckDeepEqual(t, expected[i].Mode(), f.Mode())
489+
}
490+
})
491+
}
492+
429493
func TestCopyCommand_ExecuteCommand_Extended(t *testing.T) {
430494
setupDirs := func(t *testing.T) (string, string) {
431495
testDir := t.TempDir()

pkg/util/command_util.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ func ResolveEnvAndWildcards(sd instructions.SourcesAndDest, fileContext FileCont
9999
return nil, "", errors.Wrap(err, "failed to resolve environment for dest path")
100100
}
101101
dest := dests[0]
102+
sd.DestPath = dest
102103
// Resolve wildcards and get a list of resolved sources
103104
srcs, err := ResolveSources(resolvedEnvs, fileContext.Root)
104105
if err != nil {

0 commit comments

Comments
 (0)