Make sure COPY/ADD on dirs doesn't grab too many files

Add check for / first - per LK4D4's comment.
Add a comment to explain why we're adding a /

Signed-off-by: Doug Davis <dug@us.ibm.com>
This commit is contained in:
Doug Davis 2014-09-23 12:08:42 -07:00
Родитель 7e461915a6
Коммит cd329d062b
2 изменённых файлов: 40 добавлений и 1 удалений

Просмотреть файл

@ -293,9 +293,17 @@ func calcCopyInfo(b *Builder, cmdName string, ci *copyInfo, allowRemote bool, al
return err
} else if fi.IsDir() {
var subfiles []string
absOrigPath := path.Join(b.contextPath, ci.origPath)
// Add a trailing / to make sure we only
// pick up nested files under the dir and
// not sibling files of the dir that just
// happen to start with the same chars
if !strings.HasSuffix(absOrigPath, "/") {
absOrigPath += "/"
}
for _, fileInfo := range sums {
absFile := path.Join(b.contextPath, fileInfo.Name())
absOrigPath := path.Join(b.contextPath, ci.origPath)
if strings.HasPrefix(absFile, absOrigPath) {
subfiles = append(subfiles, fileInfo.Sum())
}

Просмотреть файл

@ -1175,6 +1175,37 @@ func TestBuildADDLocalFileWithoutCache(t *testing.T) {
logDone("build - add local file without cache")
}
func TestBuildCopyDirButNotFile(t *testing.T) {
name := "testbuildcopydirbutnotfile"
defer deleteImages(name)
dockerfile := `
FROM scratch
COPY dir /tmp/`
ctx, err := fakeContext(dockerfile, map[string]string{
"dir/foo": "hello",
})
defer ctx.Close()
if err != nil {
t.Fatal(err)
}
id1, err := buildImageFromContext(name, ctx, true)
if err != nil {
t.Fatal(err)
}
// Check that adding file with similar name doesn't mess with cache
if err := ctx.Add("dir_file", "hello2"); err != nil {
t.Fatal(err)
}
id2, err := buildImageFromContext(name, ctx, true)
if err != nil {
t.Fatal(err)
}
if id1 != id2 {
t.Fatal("The cache should have been used but wasn't")
}
logDone("build - add current directory but not file")
}
func TestBuildADDCurrentDirWithCache(t *testing.T) {
name := "testbuildaddcurrentdirwithcache"
defer deleteImages(name)