From 2cd19dbc34f4f83f7ef6d2f43210f0b12ce3c419 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Fri, 26 Jul 2019 16:08:49 -0700 Subject: [PATCH] executor: ignore workdir if already exists Signed-off-by: Tonis Tiigi --- executor/containerdexecutor/executor.go | 8 +++--- executor/runcexecutor/executor.go | 6 +++-- frontend/dockerfile/dockerfile_test.go | 35 +++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/executor/containerdexecutor/executor.go b/executor/containerdexecutor/executor.go index 0ff4d3363bd9..2bb79ea7ea45 100644 --- a/executor/containerdexecutor/executor.go +++ b/executor/containerdexecutor/executor.go @@ -99,9 +99,11 @@ func (w containerdExecutor) Exec(ctx context.Context, meta executor.Meta, root c lm.Unmount() return errors.Wrapf(err, "working dir %s points to invalid target", newp) } - if err := idtools.MkdirAllAndChown(newp, 0755, identity); err != nil { - lm.Unmount() - return errors.Wrapf(err, "failed to create working directory %s", newp) + if _, err := os.Stat(newp); err != nil { + if err := idtools.MkdirAllAndChown(newp, 0755, identity); err != nil { + lm.Unmount() + return errors.Wrapf(err, "failed to create working directory %s", newp) + } } lm.Unmount() diff --git a/executor/runcexecutor/executor.go b/executor/runcexecutor/executor.go index 741c8b897845..7434409d62d5 100644 --- a/executor/runcexecutor/executor.go +++ b/executor/runcexecutor/executor.go @@ -236,8 +236,10 @@ func (w *runcExecutor) Exec(ctx context.Context, meta executor.Meta, root cache. if err != nil { return errors.Wrapf(err, "working dir %s points to invalid target", newp) } - if err := idtools.MkdirAllAndChown(newp, 0755, identity); err != nil { - return errors.Wrapf(err, "failed to create working directory %s", newp) + if _, err := os.Stat(newp); err != nil { + if err := idtools.MkdirAllAndChown(newp, 0755, identity); err != nil { + return errors.Wrapf(err, "failed to create working directory %s", newp) + } } if err := setOOMScoreAdj(spec); err != nil { diff --git a/frontend/dockerfile/dockerfile_test.go b/frontend/dockerfile/dockerfile_test.go index 8ccd793d78f1..33eac255b01f 100644 --- a/frontend/dockerfile/dockerfile_test.go +++ b/frontend/dockerfile/dockerfile_test.go @@ -108,6 +108,7 @@ var fileOpTests = []integration.Test{ testTarContext, testTarContextExternalDockerfile, testWorkdirUser, + testWorkdirExists, } var securityTests = []integration.Test{} @@ -805,6 +806,40 @@ RUN [ "$(stat -c "%U %G" /mydir)" == "user user" ] require.NoError(t, err) } +func testWorkdirExists(t *testing.T, sb integration.Sandbox) { + f := getFrontend(t, sb) + isFileOp := getFileOp(t, sb) + + dockerfile := []byte(` +FROM busybox +RUN adduser -D user +RUN mkdir /mydir && chown user:user /mydir +WORKDIR /mydir +RUN [ "$(stat -c "%U %G" /mydir)" == "user user" ] +`) + + dir, err := tmpdir( + fstest.CreateFile("Dockerfile", dockerfile, 0600), + ) + require.NoError(t, err) + defer os.RemoveAll(dir) + + c, err := client.New(context.TODO(), sb.Address()) + require.NoError(t, err) + defer c.Close() + + _, err = f.Solve(context.TODO(), c, client.SolveOpt{ + FrontendAttrs: map[string]string{ + "build-arg:BUILDKIT_DISABLE_FILEOP": strconv.FormatBool(!isFileOp), + }, + LocalDirs: map[string]string{ + builder.DefaultLocalNameDockerfile: dir, + builder.DefaultLocalNameContext: dir, + }, + }, nil) + require.NoError(t, err) +} + func testCopyChownCreateDest(t *testing.T, sb integration.Sandbox) { f := getFrontend(t, sb) isFileOp := getFileOp(t, sb)