diff --git a/components/engine/builder/dockerfile/evaluator.go b/components/engine/builder/dockerfile/evaluator.go index a3ca201e75..3864ba559d 100644 --- a/components/engine/builder/dockerfile/evaluator.go +++ b/components/engine/builder/dockerfile/evaluator.go @@ -220,7 +220,7 @@ func (s *dispatchState) beginStage(stageName string, image builder.Image) { s.imageID = image.ImageID() if image.RunConfig() != nil { - s.runConfig = image.RunConfig() + s.runConfig = copyRunConfig(image.RunConfig()) } else { s.runConfig = &container.Config{} } diff --git a/components/engine/integration-cli/docker_cli_build_test.go b/components/engine/integration-cli/docker_cli_build_test.go index 59213e5404..886cf18bd7 100644 --- a/components/engine/integration-cli/docker_cli_build_test.go +++ b/components/engine/integration-cli/docker_cli_build_test.go @@ -6234,6 +6234,28 @@ func (s *DockerSuite) TestBuildCopyFromResetScratch(c *check.C) { c.Assert(strings.TrimSpace(res), checker.Equals, "") } +func (s *DockerSuite) TestBuildMultiStageParentConfig(c *check.C) { + testRequires(c, DaemonIsLinux) + + dockerfile := ` + FROM busybox AS stage0 + WORKDIR /foo + FROM stage0 + WORKDIR sub1 + FROM stage0 + WORKDIR sub2 + ` + ctx := fakecontext.New(c, "", + fakecontext.WithDockerfile(dockerfile), + ) + defer ctx.Close() + + cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx)) + + res := cli.InspectCmd(c, "build1", cli.Format(".Config.WorkingDir")).Combined() + c.Assert(strings.TrimSpace(res), checker.Equals, "/foo/sub2") +} + func (s *DockerSuite) TestBuildIntermediateTarget(c *check.C) { dockerfile := ` FROM busybox AS build-env