mirror of https://github.com/docker/docs.git
Fix ADD caching issue with . prefixed path
Docker-DCO-1.0-Signed-off-by: Guillaume J. Charmes <charmes.guillaume@gmail.com> (github: creack)
This commit is contained in:
parent
a86a82cb7e
commit
811341423b
|
@ -412,6 +412,13 @@ func (b *buildFile) CmdAdd(args string) error {
|
||||||
} else if fi.IsDir() {
|
} else if fi.IsDir() {
|
||||||
var subfiles []string
|
var subfiles []string
|
||||||
for file, sum := range sums {
|
for file, sum := range sums {
|
||||||
|
// Has tarsum stips the '.' and './', we put it back for comparaison.
|
||||||
|
if len(file) == 0 {
|
||||||
|
file = "./"
|
||||||
|
}
|
||||||
|
if file[0] != '.' && file[0] != '/' {
|
||||||
|
file = "./" + file
|
||||||
|
}
|
||||||
if strings.HasPrefix(file, origPath) {
|
if strings.HasPrefix(file, origPath) {
|
||||||
subfiles = append(subfiles, sum)
|
subfiles = append(subfiles, sum)
|
||||||
}
|
}
|
||||||
|
|
|
@ -427,7 +427,7 @@ func TestBuildEntrypointRunCleanup(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkCacheBehavior(t *testing.T, template testContextTemplate, expectHit bool) {
|
func checkCacheBehavior(t *testing.T, template testContextTemplate, expectHit bool) (imageId string) {
|
||||||
eng := NewTestEngine(t)
|
eng := NewTestEngine(t)
|
||||||
defer nuke(mkRuntimeFromEngine(eng, t))
|
defer nuke(mkRuntimeFromEngine(eng, t))
|
||||||
|
|
||||||
|
@ -436,20 +436,36 @@ func checkCacheBehavior(t *testing.T, template testContextTemplate, expectHit bo
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
imageId := img.ID
|
imageId = img.ID
|
||||||
|
|
||||||
img = nil
|
|
||||||
img, err = buildImage(template, t, eng, expectHit)
|
img, err = buildImage(template, t, eng, expectHit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
hit := imageId == img.ID
|
if hit := imageId == img.ID; hit != expectHit {
|
||||||
if hit != expectHit {
|
t.Fatalf("Cache misbehavior, got hit=%t, expected hit=%t: (first: %s, second %s)", hit, expectHit, imageId, img.ID)
|
||||||
t.Logf("Cache misbehavior, got hit=%t, expected hit=%t: (first: %s, second %s)",
|
|
||||||
hit, expectHit, imageId, img.ID)
|
|
||||||
t.Fail()
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkCacheBehaviorFromEngime(t *testing.T, template testContextTemplate, expectHit bool, eng *engine.Engine) (imageId string) {
|
||||||
|
img, err := buildImage(template, t, eng, true)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
imageId = img.ID
|
||||||
|
|
||||||
|
img, err = buildImage(template, t, eng, expectHit)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if hit := imageId == img.ID; hit != expectHit {
|
||||||
|
t.Fatalf("Cache misbehavior, got hit=%t, expected hit=%t: (first: %s, second %s)", hit, expectHit, imageId, img.ID)
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBuildImageWithCache(t *testing.T) {
|
func TestBuildImageWithCache(t *testing.T) {
|
||||||
|
@ -476,11 +492,46 @@ func TestBuildADDLocalFileWithCache(t *testing.T) {
|
||||||
maintainer dockerio
|
maintainer dockerio
|
||||||
run echo "first"
|
run echo "first"
|
||||||
add foo /usr/lib/bla/bar
|
add foo /usr/lib/bla/bar
|
||||||
|
run [ "$(cat /usr/lib/bla/bar)" = "hello" ]
|
||||||
run echo "second"
|
run echo "second"
|
||||||
|
add . /src/
|
||||||
|
run [ "$(cat /src/foo)" = "hello" ]
|
||||||
`,
|
`,
|
||||||
[][2]string{{"foo", "hello"}},
|
[][2]string{
|
||||||
|
{"foo", "hello"},
|
||||||
|
},
|
||||||
nil}
|
nil}
|
||||||
checkCacheBehavior(t, template, true)
|
eng := NewTestEngine(t)
|
||||||
|
defer nuke(mkRuntimeFromEngine(eng, t))
|
||||||
|
|
||||||
|
id1 := checkCacheBehaviorFromEngime(t, template, true, eng)
|
||||||
|
template.files = append(template.files, [2]string{"bar", "hello2"})
|
||||||
|
id2 := checkCacheBehaviorFromEngime(t, template, true, eng)
|
||||||
|
if id1 == id2 {
|
||||||
|
t.Fatal("The cache should have been invalided but hasn't.")
|
||||||
|
}
|
||||||
|
id3 := checkCacheBehaviorFromEngime(t, template, true, eng)
|
||||||
|
if id2 != id3 {
|
||||||
|
t.Fatal("The cache should have been used but hasn't.")
|
||||||
|
}
|
||||||
|
template.files[1][1] = "hello3"
|
||||||
|
id4 := checkCacheBehaviorFromEngime(t, template, true, eng)
|
||||||
|
if id3 == id4 {
|
||||||
|
t.Fatal("The cache should have been invalided but hasn't.")
|
||||||
|
}
|
||||||
|
template.dockerfile += `
|
||||||
|
add ./bar /src2/
|
||||||
|
run ls /src2/bar
|
||||||
|
`
|
||||||
|
id5 := checkCacheBehaviorFromEngime(t, template, true, eng)
|
||||||
|
if id4 == id5 {
|
||||||
|
t.Fatal("The cache should have been invalided but hasn't.")
|
||||||
|
}
|
||||||
|
template.files[1][1] = "hello4"
|
||||||
|
id6 := checkCacheBehaviorFromEngime(t, template, true, eng)
|
||||||
|
if id5 == id6 {
|
||||||
|
t.Fatal("The cache should have been invalided but hasn't.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBuildADDLocalFileWithoutCache(t *testing.T) {
|
func TestBuildADDLocalFileWithoutCache(t *testing.T) {
|
||||||
|
|
Loading…
Reference in New Issue