Docker-DCO-1.1-Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com> (github: unclejack)
| ... | ... |
@@ -30,6 +30,7 @@ import ( |
| 30 | 30 |
"github.com/docker/docker/builder/parser" |
| 31 | 31 |
"github.com/docker/docker/daemon" |
| 32 | 32 |
"github.com/docker/docker/engine" |
| 33 |
+ "github.com/docker/docker/pkg/log" |
|
| 33 | 34 |
"github.com/docker/docker/pkg/tarsum" |
| 34 | 35 |
"github.com/docker/docker/registry" |
| 35 | 36 |
"github.com/docker/docker/runconfig" |
| ... | ... |
@@ -163,6 +164,10 @@ func (b *Builder) Run(context io.Reader) (string, error) {
|
| 163 | 163 |
return "", fmt.Errorf("No image was generated. Is your Dockerfile empty?\n")
|
| 164 | 164 |
} |
| 165 | 165 |
|
| 166 |
+ if err := os.RemoveAll(b.contextPath); err != nil {
|
|
| 167 |
+ log.Debugf("[BUILDER] failed to remove temporary context: %s", err)
|
|
| 168 |
+ } |
|
| 169 |
+ |
|
| 166 | 170 |
fmt.Fprintf(b.OutStream, "Successfully built %s\n", utils.TruncateID(b.image)) |
| 167 | 171 |
return b.image, nil |
| 168 | 172 |
} |
| ... | ... |
@@ -706,6 +706,31 @@ func TestBuildEnv(t *testing.T) {
|
| 706 | 706 |
logDone("build - env")
|
| 707 | 707 |
} |
| 708 | 708 |
|
| 709 |
+func TestBuildContextCleanup(t *testing.T) {
|
|
| 710 |
+ name := "testbuildcontextcleanup" |
|
| 711 |
+ defer deleteImages(name) |
|
| 712 |
+ entries, err := ioutil.ReadDir("/var/lib/docker/tmp")
|
|
| 713 |
+ if err != nil {
|
|
| 714 |
+ t.Fatalf("failed to list contents of tmp dir: %s", err)
|
|
| 715 |
+ } |
|
| 716 |
+ _, err = buildImage(name, |
|
| 717 |
+ `FROM scratch |
|
| 718 |
+ ENTRYPOINT ["/bin/echo"]`, |
|
| 719 |
+ true) |
|
| 720 |
+ if err != nil {
|
|
| 721 |
+ t.Fatal(err) |
|
| 722 |
+ } |
|
| 723 |
+ entriesFinal, err := ioutil.ReadDir("/var/lib/docker/tmp")
|
|
| 724 |
+ if err != nil {
|
|
| 725 |
+ t.Fatalf("failed to list contents of tmp dir: %s", err)
|
|
| 726 |
+ } |
|
| 727 |
+ if err = compareDirectoryEntries(entries, entriesFinal); err != nil {
|
|
| 728 |
+ t.Fatalf("context should have been deleted, but wasn't")
|
|
| 729 |
+ } |
|
| 730 |
+ |
|
| 731 |
+ logDone("build - verify context cleanup works properly")
|
|
| 732 |
+} |
|
| 733 |
+ |
|
| 709 | 734 |
func TestBuildCmd(t *testing.T) {
|
| 710 | 735 |
name := "testbuildcmd" |
| 711 | 736 |
expected := "[/bin/echo Hello World]" |
| ... | ... |
@@ -5,6 +5,7 @@ import ( |
| 5 | 5 |
"encoding/json" |
| 6 | 6 |
"fmt" |
| 7 | 7 |
"io" |
| 8 |
+ "os" |
|
| 8 | 9 |
"os/exec" |
| 9 | 10 |
"reflect" |
| 10 | 11 |
"strings" |
| ... | ... |
@@ -175,3 +176,20 @@ func waitRun(contId string) error {
|
| 175 | 175 |
|
| 176 | 176 |
return nil |
| 177 | 177 |
} |
| 178 |
+ |
|
| 179 |
+func compareDirectoryEntries(e1 []os.FileInfo, e2 []os.FileInfo) error {
|
|
| 180 |
+ var ( |
|
| 181 |
+ e1Entries = make(map[string]struct{})
|
|
| 182 |
+ e2Entries = make(map[string]struct{})
|
|
| 183 |
+ ) |
|
| 184 |
+ for _, e := range e1 {
|
|
| 185 |
+ e1Entries[e.Name()] = struct{}{}
|
|
| 186 |
+ } |
|
| 187 |
+ for _, e := range e2 {
|
|
| 188 |
+ e2Entries[e.Name()] = struct{}{}
|
|
| 189 |
+ } |
|
| 190 |
+ if !reflect.DeepEqual(e1Entries, e2Entries) {
|
|
| 191 |
+ return fmt.Errorf("entries differ")
|
|
| 192 |
+ } |
|
| 193 |
+ return nil |
|
| 194 |
+} |