From e16086005425b626bccc0fedcf5ae195f913c636 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Fri, 6 Jan 2017 11:55:37 -0800 Subject: [PATCH] Fix workdir cache invalidation Signed-off-by: Tonis Tiigi --- builder/dockerfile/dispatchers.go | 14 ++++++++------ integration-cli/docker_cli_build_test.go | 6 +++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index 81d6d04c2a..a6ee9165e3 100644 --- a/builder/dockerfile/dispatchers.go +++ b/builder/dockerfile/dispatchers.go @@ -298,17 +298,19 @@ func workdir(b *Builder, args []string, attributes map[string]bool, original str } b.runConfig.Image = b.image + cmd := b.runConfig.Cmd + comment := "WORKDIR " + b.runConfig.WorkingDir + // reset the command for cache detection + b.runConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), "#(nop) "+comment)) + defer func(cmd strslice.StrSlice) { b.runConfig.Cmd = cmd }(cmd) + if hit, err := b.probeCache(); err != nil { return err } else if hit { return nil } - // Actually copy the struct - workdirConfig := *b.runConfig - workdirConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), fmt.Sprintf("#(nop) WORKDIR %s", b.runConfig.WorkingDir))) - - container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: &workdirConfig}) + container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: b.runConfig}) if err != nil { return err } @@ -317,7 +319,7 @@ func workdir(b *Builder, args []string, attributes map[string]bool, original str return err } - return b.commit(container.ID, b.runConfig.Cmd, "WORKDIR "+b.runConfig.WorkingDir) + return b.commit(container.ID, cmd, comment) } // RUN some command yo diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 50fa5fe336..cc6cf98cf7 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -7398,6 +7398,10 @@ func (s *DockerSuite) TestBuildWorkdirCmd(c *check.C) { FROM busybox WORKDIR / ` - _, err := buildImage("testbuildworkdircmd", dockerFile, false) + _, err := buildImage("testbuildworkdircmd", dockerFile, true) c.Assert(err, checker.IsNil) + + _, out, err := buildImageWithOut("testbuildworkdircmd", dockerFile, true) + c.Assert(err, checker.IsNil) + c.Assert(strings.Count(out, "Using cache"), checker.Equals, 1) }