diff --git a/daemon/cache.go b/daemon/cache.go index a2c2c137f5..5ea13fd988 100644 --- a/daemon/cache.go +++ b/daemon/cache.go @@ -215,7 +215,7 @@ func isValidParent(img, parent *image.Image) bool { if len(parent.History) >= len(img.History) { return false } - if len(parent.RootFS.DiffIDs) >= len(img.RootFS.DiffIDs) { + if len(parent.RootFS.DiffIDs) > len(img.RootFS.DiffIDs) { return false } diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 41470f9777..49f287545c 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -7081,6 +7081,27 @@ func (s *DockerSuite) TestBuildWithFailure(c *check.C) { c.Assert(stdout, checker.Not(checker.Contains), "Step 2/2 : RUN nobody") } +func (s *DockerSuite) TestBuildCacheFromEqualDiffIDsLength(c *check.C) { + dockerfile := ` + FROM busybox + RUN echo "test" + ENTRYPOINT ["sh"]` + ctx, err := fakeContext(dockerfile, map[string]string{ + "Dockerfile": dockerfile, + }) + c.Assert(err, checker.IsNil) + defer ctx.Close() + + id1, err := buildImageFromContext("build1", ctx, true) + c.Assert(err, checker.IsNil) + + // rebuild with cache-from + id2, out, err := buildImageFromContextWithOut("build2", ctx, true, "--cache-from=build1") + c.Assert(err, checker.IsNil) + c.Assert(id1, checker.Equals, id2) + c.Assert(strings.Count(out, "Using cache"), checker.Equals, 2) +} + func (s *DockerSuite) TestBuildCacheFrom(c *check.C) { testRequires(c, DaemonIsLinux) // All tests that do save are skipped in windows dockerfile := `