From 31c0039022234972c79947a6299c0fa382436487 Mon Sep 17 00:00:00 2001 From: unclejack Date: Mon, 15 Sep 2014 16:01:23 +0300 Subject: [PATCH] clean up the context when a build fails Docker-DCO-1.1-Signed-off-by: Cristian Staretu (github: unclejack) --- builder/evaluator.go | 10 ++++++---- integration-cli/docker_cli_build_test.go | 25 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/builder/evaluator.go b/builder/evaluator.go index bd30033dae..6bcd2194c2 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -119,6 +119,12 @@ func (b *Builder) Run(context io.Reader) (string, error) { return "", err } + defer func() { + if err := os.RemoveAll(b.contextPath); err != nil { + log.Debugf("[BUILDER] failed to remove temporary context: %s", err) + } + }() + filename := path.Join(b.contextPath, "Dockerfile") fi, err := os.Stat(filename) @@ -164,10 +170,6 @@ func (b *Builder) Run(context io.Reader) (string, error) { return "", fmt.Errorf("No image was generated. Is your Dockerfile empty?\n") } - if err := os.RemoveAll(b.contextPath); err != nil { - log.Debugf("[BUILDER] failed to remove temporary context: %s", err) - } - fmt.Fprintf(b.OutStream, "Successfully built %s\n", utils.TruncateID(b.image)) return b.image, nil } diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 58d99a7d6b..74b3a36fa3 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -731,6 +731,31 @@ func TestBuildContextCleanup(t *testing.T) { logDone("build - verify context cleanup works properly") } +func TestBuildContextCleanupFailedBuild(t *testing.T) { + name := "testbuildcontextcleanup" + defer deleteImages(name) + entries, err := ioutil.ReadDir("/var/lib/docker/tmp") + if err != nil { + t.Fatalf("failed to list contents of tmp dir: %s", err) + } + _, err = buildImage(name, + `FROM scratch + RUN /non/existing/command`, + true) + if err == nil { + t.Fatalf("expected build to fail, but it didn't") + } + entriesFinal, err := ioutil.ReadDir("/var/lib/docker/tmp") + if err != nil { + t.Fatalf("failed to list contents of tmp dir: %s", err) + } + if err = compareDirectoryEntries(entries, entriesFinal); err != nil { + t.Fatalf("context should have been deleted, but wasn't") + } + + logDone("build - verify context cleanup works properly after a failed build") +} + func TestBuildCmd(t *testing.T) { name := "testbuildcmd" expected := "[/bin/echo Hello World]"