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
This commit is contained in:
Alessandro Bitocchi 2024-03-19 08:24:46 +01:00 committed by GitHub
parent 8148159c30
commit ba433abdb6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 65 additions and 0 deletions

View File

@ -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()

View File

@ -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 {