Browse code

Move FakeContext to `integration-cli/cli/build/context` package…

… and continue emptying `docker_utils_test.go` from build related function.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Vincent Demeester authored on 2017/04/10 21:42:21
Showing 14 changed files
... ...
@@ -14,6 +14,7 @@ import (
14 14
 	"github.com/docker/docker/api/types/swarm"
15 15
 	cliconfig "github.com/docker/docker/cli/config"
16 16
 	"github.com/docker/docker/integration-cli/cli"
17
+	"github.com/docker/docker/integration-cli/cli/build/fakestorage"
17 18
 	"github.com/docker/docker/integration-cli/daemon"
18 19
 	"github.com/docker/docker/integration-cli/environment"
19 20
 	"github.com/docker/docker/integration-cli/registry"
... ...
@@ -65,6 +66,7 @@ func TestMain(m *testing.M) {
65 65
 
66 66
 func Test(t *testing.T) {
67 67
 	cli.EnsureTestEnvIsLoaded(t)
68
+	fakestorage.EnsureTestEnvIsLoaded(t)
68 69
 	cmd := exec.Command(dockerBinary, "images", "-f", "dangling=false", "--format", "{{.Repository}}:{{.Tag}}")
69 70
 	cmd.Env = appendBaseEnv(true)
70 71
 	out, err := cmd.CombinedOutput()
... ...
@@ -1,11 +1,30 @@
1 1
 package build
2 2
 
3 3
 import (
4
+	"io"
4 5
 	"strings"
5 6
 
7
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
6 8
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
7 9
 )
8 10
 
11
+type testingT interface {
12
+	Fatal(args ...interface{})
13
+	Fatalf(string, ...interface{})
14
+}
15
+
16
+// WithStdinContext sets the build context from the standard input with the specified reader
17
+func WithStdinContext(closer io.ReadCloser) func(*icmd.Cmd) func() {
18
+	return func(cmd *icmd.Cmd) func() {
19
+		cmd.Command = append(cmd.Command, "-")
20
+		cmd.Stdin = closer
21
+		return func() {
22
+			// FIXME(vdemeester) we should not ignore the error here…
23
+			closer.Close()
24
+		}
25
+	}
26
+}
27
+
9 28
 // WithDockerfile creates / returns a CmdOperator to set the Dockerfile for a build operation
10 29
 func WithDockerfile(dockerfile string) func(*icmd.Cmd) func() {
11 30
 	return func(cmd *icmd.Cmd) func() {
... ...
@@ -28,3 +47,36 @@ func WithContextPath(path string) func(*icmd.Cmd) func() {
28 28
 		return nil
29 29
 	}
30 30
 }
31
+
32
+// WithExternalBuildContext use the specified context as build context
33
+func WithExternalBuildContext(ctx *fakecontext.Fake) func(*icmd.Cmd) func() {
34
+	return func(cmd *icmd.Cmd) func() {
35
+		cmd.Dir = ctx.Dir
36
+		cmd.Command = append(cmd.Command, ".")
37
+		return nil
38
+	}
39
+}
40
+
41
+// WithBuildContext sets up the build context
42
+func WithBuildContext(t testingT, contextOperators ...func(*fakecontext.Fake) error) func(*icmd.Cmd) func() {
43
+	// FIXME(vdemeester) de-duplicate that
44
+	ctx := fakecontext.New(t, "", contextOperators...)
45
+	return func(cmd *icmd.Cmd) func() {
46
+		cmd.Dir = ctx.Dir
47
+		cmd.Command = append(cmd.Command, ".")
48
+		return closeBuildContext(t, ctx)
49
+	}
50
+}
51
+
52
+// WithFile adds the specified file (with content) in the build context
53
+func WithFile(name, content string) func(*fakecontext.Fake) error {
54
+	return fakecontext.WithFile(name, content)
55
+}
56
+
57
+func closeBuildContext(t testingT, ctx *fakecontext.Fake) func() {
58
+	return func() {
59
+		if err := ctx.Close(); err != nil {
60
+			t.Fatal(err)
61
+		}
62
+	}
63
+}
31 64
new file mode 100644
... ...
@@ -0,0 +1,112 @@
0
+package fakecontext
1
+
2
+import (
3
+	"bytes"
4
+	"io/ioutil"
5
+	"os"
6
+	"path/filepath"
7
+)
8
+
9
+type testingT interface {
10
+	Fatal(args ...interface{})
11
+	Fatalf(string, ...interface{})
12
+}
13
+
14
+// New creates a fake build context
15
+func New(t testingT, dir string, modifiers ...func(*Fake) error) *Fake {
16
+	fakeContext := &Fake{Dir: dir}
17
+	if dir == "" {
18
+		if err := newDir(fakeContext); err != nil {
19
+			t.Fatal(err)
20
+		}
21
+	}
22
+
23
+	for _, modifier := range modifiers {
24
+		if err := modifier(fakeContext); err != nil {
25
+			t.Fatal(err)
26
+		}
27
+	}
28
+
29
+	return fakeContext
30
+}
31
+
32
+func newDir(fake *Fake) error {
33
+	tmp, err := ioutil.TempDir("", "fake-context")
34
+	if err != nil {
35
+		return err
36
+	}
37
+	if err := os.Chmod(tmp, 0755); err != nil {
38
+		return err
39
+	}
40
+	fake.Dir = tmp
41
+	return nil
42
+}
43
+
44
+// WithFile adds the specified file (with content) in the build context
45
+func WithFile(name, content string) func(*Fake) error {
46
+	return func(ctx *Fake) error {
47
+		return ctx.Add(name, content)
48
+	}
49
+}
50
+
51
+// WithDockerfile adds the specified content as Dockerfile in the build context
52
+func WithDockerfile(content string) func(*Fake) error {
53
+	return WithFile("Dockerfile", content)
54
+}
55
+
56
+// WithFiles adds the specified files in the build context, content is a string
57
+func WithFiles(files map[string]string) func(*Fake) error {
58
+	return func(fakeContext *Fake) error {
59
+		for file, content := range files {
60
+			if err := fakeContext.Add(file, content); err != nil {
61
+				return err
62
+			}
63
+		}
64
+		return nil
65
+	}
66
+}
67
+
68
+// WithBinaryFiles adds the specified files in the build context, content is binary
69
+func WithBinaryFiles(files map[string]*bytes.Buffer) func(*Fake) error {
70
+	return func(fakeContext *Fake) error {
71
+		for file, content := range files {
72
+			if err := fakeContext.Add(file, string(content.Bytes())); err != nil {
73
+				return err
74
+			}
75
+		}
76
+		return nil
77
+	}
78
+}
79
+
80
+// Fake creates directories that can be used as a build context
81
+type Fake struct {
82
+	Dir string
83
+}
84
+
85
+// Add a file at a path, creating directories where necessary
86
+func (f *Fake) Add(file, content string) error {
87
+	return f.addFile(file, []byte(content))
88
+}
89
+
90
+func (f *Fake) addFile(file string, content []byte) error {
91
+	fp := filepath.Join(f.Dir, filepath.FromSlash(file))
92
+	dirpath := filepath.Dir(fp)
93
+	if dirpath != "." {
94
+		if err := os.MkdirAll(dirpath, 0755); err != nil {
95
+			return err
96
+		}
97
+	}
98
+	return ioutil.WriteFile(fp, content, 0644)
99
+
100
+}
101
+
102
+// Delete a file at a path
103
+func (f *Fake) Delete(file string) error {
104
+	fp := filepath.Join(f.Dir, filepath.FromSlash(file))
105
+	return os.RemoveAll(fp)
106
+}
107
+
108
+// Close deletes the context
109
+func (f *Fake) Close() error {
110
+	return os.RemoveAll(f.Dir)
111
+}
0 112
new file mode 100644
... ...
@@ -0,0 +1,67 @@
0
+package fakestorage
1
+
2
+import (
3
+	"io/ioutil"
4
+	"os"
5
+	"os/exec"
6
+	"path/filepath"
7
+	"sync"
8
+
9
+	"github.com/docker/docker/integration-cli/cli"
10
+)
11
+
12
+var ensureHTTPServerOnce sync.Once
13
+
14
+func ensureHTTPServerImage(t testingT) {
15
+	var doIt bool
16
+	ensureHTTPServerOnce.Do(func() {
17
+		doIt = true
18
+	})
19
+
20
+	if !doIt {
21
+		return
22
+	}
23
+
24
+	defer testEnv.ProtectImage(t, "httpserver:latest")
25
+
26
+	tmp, err := ioutil.TempDir("", "docker-http-server-test")
27
+	if err != nil {
28
+		t.Fatalf("could not build http server: %v", err)
29
+	}
30
+	defer os.RemoveAll(tmp)
31
+
32
+	goos := testEnv.DaemonPlatform()
33
+	if goos == "" {
34
+		goos = "linux"
35
+	}
36
+	goarch := os.Getenv("DOCKER_ENGINE_GOARCH")
37
+	if goarch == "" {
38
+		goarch = "amd64"
39
+	}
40
+
41
+	goCmd, lookErr := exec.LookPath("go")
42
+	if lookErr != nil {
43
+		t.Fatalf("could not build http server: %v", lookErr)
44
+	}
45
+
46
+	cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "httpserver"), "github.com/docker/docker/contrib/httpserver")
47
+	cmd.Env = append(os.Environ(), []string{
48
+		"CGO_ENABLED=0",
49
+		"GOOS=" + goos,
50
+		"GOARCH=" + goarch,
51
+	}...)
52
+	var out []byte
53
+	if out, err = cmd.CombinedOutput(); err != nil {
54
+		t.Fatalf("could not build http server: %s", string(out))
55
+	}
56
+
57
+	cpCmd, lookErr := exec.LookPath("cp")
58
+	if lookErr != nil {
59
+		t.Fatalf("could not build http server: %v", lookErr)
60
+	}
61
+	if out, err = exec.Command(cpCmd, "../contrib/httpserver/Dockerfile", filepath.Join(tmp, "Dockerfile")).CombinedOutput(); err != nil {
62
+		t.Fatalf("could not build http server: %v", string(out))
63
+	}
64
+
65
+	cli.DockerCmd(t, "build", "-q", "-t", "httpserver", tmp)
66
+}
0 67
new file mode 100644
... ...
@@ -0,0 +1,176 @@
0
+package fakestorage
1
+
2
+import (
3
+	"fmt"
4
+	"net"
5
+	"net/http"
6
+	"net/http/httptest"
7
+	"net/url"
8
+	"os"
9
+	"strings"
10
+	"sync"
11
+
12
+	"github.com/docker/docker/integration-cli/cli"
13
+	"github.com/docker/docker/integration-cli/cli/build"
14
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
15
+	"github.com/docker/docker/integration-cli/environment"
16
+	"github.com/docker/docker/integration-cli/request"
17
+	"github.com/docker/docker/pkg/stringutils"
18
+)
19
+
20
+var (
21
+	testEnv  *environment.Execution
22
+	onlyOnce sync.Once
23
+)
24
+
25
+// EnsureTestEnvIsLoaded make sure the test environment is loaded for this package
26
+func EnsureTestEnvIsLoaded(t testingT) {
27
+	var doIt bool
28
+	var err error
29
+	onlyOnce.Do(func() {
30
+		doIt = true
31
+	})
32
+
33
+	if !doIt {
34
+		return
35
+	}
36
+	testEnv, err = environment.New()
37
+	if err != nil {
38
+		t.Fatalf("error loading testenv : %v", err)
39
+	}
40
+}
41
+
42
+type testingT interface {
43
+	logT
44
+	Fatal(args ...interface{})
45
+	Fatalf(string, ...interface{})
46
+}
47
+
48
+type logT interface {
49
+	Logf(string, ...interface{})
50
+}
51
+
52
+// Fake is a static file server. It might be running locally or remotely
53
+// on test host.
54
+type Fake interface {
55
+	Close() error
56
+	URL() string
57
+	CtxDir() string
58
+}
59
+
60
+// New returns a static file server that will be use as build context.
61
+func New(t testingT, dir string, modifiers ...func(*fakecontext.Fake) error) Fake {
62
+	ctx := fakecontext.New(t, dir, modifiers...)
63
+	if testEnv.LocalDaemon() {
64
+		return newLocalFakeStorage(t, ctx)
65
+	}
66
+	return newRemoteFileServer(t, ctx)
67
+}
68
+
69
+// localFileStorage is a file storage on the running machine
70
+type localFileStorage struct {
71
+	*fakecontext.Fake
72
+	*httptest.Server
73
+}
74
+
75
+func (s *localFileStorage) URL() string {
76
+	return s.Server.URL
77
+}
78
+
79
+func (s *localFileStorage) CtxDir() string {
80
+	return s.Fake.Dir
81
+}
82
+
83
+func (s *localFileStorage) Close() error {
84
+	defer s.Server.Close()
85
+	return s.Fake.Close()
86
+}
87
+
88
+func newLocalFakeStorage(t testingT, ctx *fakecontext.Fake) *localFileStorage {
89
+	handler := http.FileServer(http.Dir(ctx.Dir))
90
+	server := httptest.NewServer(handler)
91
+	return &localFileStorage{
92
+		Fake:   ctx,
93
+		Server: server,
94
+	}
95
+}
96
+
97
+// remoteFileServer is a containerized static file server started on the remote
98
+// testing machine to be used in URL-accepting docker build functionality.
99
+type remoteFileServer struct {
100
+	host      string // hostname/port web server is listening to on docker host e.g. 0.0.0.0:43712
101
+	container string
102
+	image     string
103
+	ctx       *fakecontext.Fake
104
+}
105
+
106
+func (f *remoteFileServer) URL() string {
107
+	u := url.URL{
108
+		Scheme: "http",
109
+		Host:   f.host}
110
+	return u.String()
111
+}
112
+
113
+func (f *remoteFileServer) CtxDir() string {
114
+	return f.ctx.Dir
115
+}
116
+
117
+func (f *remoteFileServer) Close() error {
118
+	defer func() {
119
+		if f.ctx != nil {
120
+			f.ctx.Close()
121
+		}
122
+		if f.image != "" {
123
+			if err := cli.Docker(cli.Args("rmi", "-f", f.image)).Error; err != nil {
124
+				fmt.Fprintf(os.Stderr, "Error closing remote file server : %v\n", err)
125
+			}
126
+		}
127
+	}()
128
+	if f.container == "" {
129
+		return nil
130
+	}
131
+	return cli.Docker(cli.Args("rm", "-fv", f.container)).Error
132
+}
133
+
134
+func newRemoteFileServer(t testingT, ctx *fakecontext.Fake) *remoteFileServer {
135
+	var (
136
+		image     = fmt.Sprintf("fileserver-img-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10)))
137
+		container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10)))
138
+	)
139
+
140
+	ensureHTTPServerImage(t)
141
+
142
+	// Build the image
143
+	if err := ctx.Add("Dockerfile", `FROM httpserver
144
+COPY . /static`); err != nil {
145
+		t.Fatal(err)
146
+	}
147
+	cli.BuildCmd(t, image, build.WithoutCache, build.WithExternalBuildContext(ctx))
148
+
149
+	// Start the container
150
+	cli.DockerCmd(t, "run", "-d", "-P", "--name", container, image)
151
+
152
+	// Find out the system assigned port
153
+	out := cli.DockerCmd(t, "port", container, "80/tcp").Combined()
154
+	fileserverHostPort := strings.Trim(out, "\n")
155
+	_, port, err := net.SplitHostPort(fileserverHostPort)
156
+	if err != nil {
157
+		t.Fatalf("unable to parse file server host:port: %v", err)
158
+	}
159
+
160
+	dockerHostURL, err := url.Parse(request.DaemonHost())
161
+	if err != nil {
162
+		t.Fatalf("unable to parse daemon host URL: %v", err)
163
+	}
164
+
165
+	host, _, err := net.SplitHostPort(dockerHostURL.Host)
166
+	if err != nil {
167
+		t.Fatalf("unable to parse docker daemon host:port: %v", err)
168
+	}
169
+
170
+	return &remoteFileServer{
171
+		container: container,
172
+		image:     image,
173
+		host:      fmt.Sprintf("%s:%s", host, port),
174
+		ctx:       ctx}
175
+}
... ...
@@ -39,6 +39,7 @@ func EnsureTestEnvIsLoaded(t testingT) {
39 39
 type CmdOperator func(*icmd.Cmd) func()
40 40
 
41 41
 type testingT interface {
42
+	Fatal(args ...interface{})
42 43
 	Fatalf(string, ...interface{})
43 44
 }
44 45
 
... ...
@@ -9,6 +9,8 @@ import (
9 9
 	"strings"
10 10
 
11 11
 	"github.com/docker/docker/integration-cli/checker"
12
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
13
+	"github.com/docker/docker/integration-cli/cli/build/fakestorage"
12 14
 	"github.com/docker/docker/integration-cli/request"
13 15
 	"github.com/docker/docker/pkg/testutil"
14 16
 	"github.com/go-check/check"
... ...
@@ -29,7 +31,7 @@ COPY * /tmp/
29 29
 RUN find / -xdev -name ba*
30 30
 RUN find /tmp/`
31 31
 	}
32
-	server := fakeStorage(c, map[string]string{"testD": testD})
32
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{"testD": testD}))
33 33
 	defer server.Close()
34 34
 
35 35
 	res, body, err := request.Post("/build?dockerfile=baz&remote="+server.URL()+"/testD", request.JSON)
... ...
@@ -66,9 +68,9 @@ func (s *DockerSuite) TestBuildAPIRemoteTarballContext(c *check.C) {
66 66
 	// failed to close tar archive
67 67
 	c.Assert(tw.Close(), checker.IsNil)
68 68
 
69
-	server := fakeBinaryStorage(c, map[string]*bytes.Buffer{
69
+	server := fakestorage.New(c, "", fakecontext.WithBinaryFiles(map[string]*bytes.Buffer{
70 70
 		"testT.tar": buffer,
71
-	})
71
+	}))
72 72
 	defer server.Close()
73 73
 
74 74
 	res, b, err := request.Post("/build?remote="+server.URL()+"/testT.tar", request.ContentType("application/tar"))
... ...
@@ -113,9 +115,9 @@ RUN echo 'right'
113 113
 	// failed to close tar archive
114 114
 	c.Assert(tw.Close(), checker.IsNil)
115 115
 
116
-	server := fakeBinaryStorage(c, map[string]*bytes.Buffer{
116
+	server := fakestorage.New(c, "", fakecontext.WithBinaryFiles(map[string]*bytes.Buffer{
117 117
 		"testT.tar": buffer,
118
-	})
118
+	}))
119 119
 	defer server.Close()
120 120
 
121 121
 	url := "/build?dockerfile=custom&remote=" + server.URL() + "/testT.tar"
... ...
@@ -20,6 +20,8 @@ import (
20 20
 	"github.com/docker/docker/integration-cli/checker"
21 21
 	"github.com/docker/docker/integration-cli/cli"
22 22
 	"github.com/docker/docker/integration-cli/cli/build"
23
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
24
+	"github.com/docker/docker/integration-cli/cli/build/fakestorage"
23 25
 	"github.com/docker/docker/pkg/archive"
24 26
 	"github.com/docker/docker/pkg/stringutils"
25 27
 	"github.com/docker/docker/pkg/testutil"
... ...
@@ -143,8 +145,8 @@ func (s *DockerSuite) TestBuildEnvironmentReplacementWorkdir(c *check.C) {
143 143
 func (s *DockerSuite) TestBuildEnvironmentReplacementAddCopy(c *check.C) {
144 144
 	name := "testbuildenvironmentreplacement"
145 145
 
146
-	buildImageSuccessfully(c, name, withBuildContext(c,
147
-		withFile("Dockerfile", `
146
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
147
+		build.WithFile("Dockerfile", `
148 148
   FROM `+minimalBaseImage()+`
149 149
   ENV baz foo
150 150
   ENV quux bar
... ...
@@ -157,10 +159,10 @@ func (s *DockerSuite) TestBuildEnvironmentReplacementAddCopy(c *check.C) {
157 157
   ADD ${zzz:-${fee}} ${dot}
158 158
   COPY ${zzz:-${gee}} ${dot}
159 159
   `),
160
-		withFile("foo", "test1"),
161
-		withFile("bar", "test2"),
162
-		withFile("fff", "test3"),
163
-		withFile("ggg", "test4"),
160
+		build.WithFile("foo", "test1"),
161
+		build.WithFile("bar", "test2"),
162
+		build.WithFile("fff", "test3"),
163
+		build.WithFile("ggg", "test4"),
164 164
 	))
165 165
 }
166 166
 
... ...
@@ -362,10 +364,10 @@ ONBUILD ENTRYPOINT ["echo"]`))
362 362
 func (s *DockerSuite) TestBuildCacheAdd(c *check.C) {
363 363
 	testRequires(c, DaemonIsLinux) // Windows doesn't have httpserver image yet
364 364
 	name := "testbuildtwoimageswithadd"
365
-	server := fakeStorage(c, map[string]string{
365
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{
366 366
 		"robots.txt": "hello",
367 367
 		"index.html": "world",
368
-	})
368
+	}))
369 369
 	defer server.Close()
370 370
 
371 371
 	cli.BuildCmd(c, name, build.WithDockerfile(fmt.Sprintf(`FROM scratch
... ...
@@ -386,9 +388,9 @@ func (s *DockerSuite) TestBuildLastModified(c *check.C) {
386 386
 
387 387
 	name := "testbuildlastmodified"
388 388
 
389
-	server := fakeStorage(c, map[string]string{
389
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{
390 390
 		"file": "hello",
391
-	})
391
+	}))
392 392
 	defer server.Close()
393 393
 
394 394
 	var out, out2 string
... ...
@@ -397,15 +399,15 @@ func (s *DockerSuite) TestBuildLastModified(c *check.C) {
397 397
 ADD %s/file /`
398 398
 	dockerfile := fmt.Sprintf(dFmt, server.URL())
399 399
 
400
-	buildImageSuccessfully(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
401
-	out, _ = dockerCmd(c, "run", name, "ls", "-le", "/file")
400
+	cli.BuildCmd(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
401
+	out = cli.DockerCmd(c, "run", name, "ls", "-le", "/file").Combined()
402 402
 
403 403
 	// Build it again and make sure the mtime of the file didn't change.
404 404
 	// Wait a few seconds to make sure the time changed enough to notice
405 405
 	time.Sleep(2 * time.Second)
406 406
 
407
-	buildImageSuccessfully(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
408
-	out2, _ = dockerCmd(c, "run", name, "ls", "-le", "/file")
407
+	cli.BuildCmd(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
408
+	out2 = cli.DockerCmd(c, "run", name, "ls", "-le", "/file").Combined()
409 409
 
410 410
 	if out != out2 {
411 411
 		c.Fatalf("MTime changed:\nOrigin:%s\nNew:%s", out, out2)
... ...
@@ -413,14 +415,14 @@ ADD %s/file /`
413 413
 
414 414
 	// Now 'touch' the file and make sure the timestamp DID change this time
415 415
 	// Create a new fakeStorage instead of just using Add() to help windows
416
-	server = fakeStorage(c, map[string]string{
416
+	server = fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{
417 417
 		"file": "hello",
418
-	})
418
+	}))
419 419
 	defer server.Close()
420 420
 
421 421
 	dockerfile = fmt.Sprintf(dFmt, server.URL())
422
-	buildImageSuccessfully(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
423
-	out2, _ = dockerCmd(c, "run", name, "ls", "-le", "/file")
422
+	cli.BuildCmd(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
423
+	out2 = cli.DockerCmd(c, "run", name, "ls", "-le", "/file").Combined()
424 424
 
425 425
 	if out == out2 {
426 426
 		c.Fatalf("MTime didn't change:\nOrigin:%s\nNew:%s", out, out2)
... ...
@@ -434,20 +436,19 @@ ADD %s/file /`
434 434
 func (s *DockerSuite) TestBuildModifyFileInFolder(c *check.C) {
435 435
 	name := "testbuildmodifyfileinfolder"
436 436
 
437
-	ctx := fakeContext(c, `FROM busybox
437
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(`FROM busybox
438 438
 RUN ["mkdir", "/test"]
439
-ADD folder/file /test/changetarget`,
440
-		map[string]string{})
439
+ADD folder/file /test/changetarget`))
441 440
 	defer ctx.Close()
442 441
 	if err := ctx.Add("folder/file", "first"); err != nil {
443 442
 		c.Fatal(err)
444 443
 	}
445
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
444
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
446 445
 	id1 := getIDByName(c, name)
447 446
 	if err := ctx.Add("folder/file", "second"); err != nil {
448 447
 		c.Fatal(err)
449 448
 	}
450
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
449
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
451 450
 	id2 := getIDByName(c, name)
452 451
 	if id1 == id2 {
453 452
 		c.Fatal("cache was used even though file contents in folder was changed")
... ...
@@ -456,8 +457,8 @@ ADD folder/file /test/changetarget`,
456 456
 
457 457
 func (s *DockerSuite) TestBuildAddSingleFileToRoot(c *check.C) {
458 458
 	testRequires(c, DaemonIsLinux) // Linux specific test
459
-	buildImageSuccessfully(c, "testaddimg", withBuildContext(c,
460
-		withFile("Dockerfile", fmt.Sprintf(`FROM busybox
459
+	buildImageSuccessfully(c, "testaddimg", build.WithBuildContext(c,
460
+		build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
461 461
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
462 462
 RUN echo 'dockerio:x:1001:' >> /etc/group
463 463
 RUN touch /exists
... ...
@@ -466,22 +467,23 @@ ADD test_file /
466 466
 RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
467 467
 RUN [ $(ls -l /test_file | awk '{print $1}') = '%s' ]
468 468
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod)),
469
-		withFile("test_file", "test1")))
469
+		build.WithFile("test_file", "test1")))
470 470
 }
471 471
 
472 472
 // Issue #3960: "ADD src ." hangs
473 473
 func (s *DockerSuite) TestBuildAddSingleFileToWorkdir(c *check.C) {
474 474
 	name := "testaddsinglefiletoworkdir"
475
-	ctx := fakeContext(c, `FROM busybox
476
-ADD test_file .`,
477
-		map[string]string{
475
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(
476
+		`FROM busybox
477
+	       ADD test_file .`),
478
+		fakecontext.WithFiles(map[string]string{
478 479
 			"test_file": "test1",
479
-		})
480
+		}))
480 481
 	defer ctx.Close()
481 482
 
482 483
 	errChan := make(chan error)
483 484
 	go func() {
484
-		errChan <- buildImage(name, withExternalBuildContext(ctx)).Error
485
+		errChan <- buildImage(name, build.WithExternalBuildContext(ctx)).Error
485 486
 		close(errChan)
486 487
 	}()
487 488
 	select {
... ...
@@ -494,8 +496,8 @@ ADD test_file .`,
494 494
 
495 495
 func (s *DockerSuite) TestBuildAddSingleFileToExistDir(c *check.C) {
496 496
 	testRequires(c, DaemonIsLinux) // Linux specific test
497
-	buildImageSuccessfully(c, "testaddsinglefiletoexistdir", withBuildContext(c,
498
-		withFile("Dockerfile", `FROM busybox
497
+	buildImageSuccessfully(c, "testaddsinglefiletoexistdir", build.WithBuildContext(c,
498
+		build.WithFile("Dockerfile", `FROM busybox
499 499
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
500 500
 RUN echo 'dockerio:x:1001:' >> /etc/group
501 501
 RUN mkdir /exists
... ...
@@ -505,18 +507,18 @@ ADD test_file /exists/
505 505
 RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
506 506
 RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]
507 507
 RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`),
508
-		withFile("test_file", "test1")))
508
+		build.WithFile("test_file", "test1")))
509 509
 }
510 510
 
511 511
 func (s *DockerSuite) TestBuildCopyAddMultipleFiles(c *check.C) {
512 512
 	testRequires(c, DaemonIsLinux) // Linux specific test
513
-	server := fakeStorage(c, map[string]string{
513
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{
514 514
 		"robots.txt": "hello",
515
-	})
515
+	}))
516 516
 	defer server.Close()
517 517
 
518
-	buildImageSuccessfully(c, "testcopymultiplefilestofile", withBuildContext(c,
519
-		withFile("Dockerfile", fmt.Sprintf(`FROM busybox
518
+	cli.BuildCmd(c, "testcopymultiplefilestofile", build.WithBuildContext(c,
519
+		build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
520 520
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
521 521
 RUN echo 'dockerio:x:1001:' >> /etc/group
522 522
 RUN mkdir /exists
... ...
@@ -532,11 +534,11 @@ RUN [ $(ls -l /exists/test_file4 | awk '{print $3":"$4}') = 'root:root' ]
532 532
 RUN [ $(ls -l /exists/robots.txt | awk '{print $3":"$4}') = 'root:root' ]
533 533
 RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
534 534
 `, server.URL())),
535
-		withFile("test_file1", "test1"),
536
-		withFile("test_file2", "test2"),
537
-		withFile("test_file3", "test3"),
538
-		withFile("test_file3", "test3"),
539
-		withFile("test_file4", "test4")))
535
+		build.WithFile("test_file1", "test1"),
536
+		build.WithFile("test_file2", "test2"),
537
+		build.WithFile("test_file3", "test3"),
538
+		build.WithFile("test_file3", "test3"),
539
+		build.WithFile("test_file4", "test4")))
540 540
 }
541 541
 
542 542
 // These tests are mainly for user namespaces to verify that new directories
... ...
@@ -550,11 +552,11 @@ func (s *DockerSuite) TestBuildUsernamespaceValidateRemappedRoot(c *check.C) {
550 550
 	}
551 551
 	name := "testbuildusernamespacevalidateremappedroot"
552 552
 	for _, tc := range testCases {
553
-		buildImageSuccessfully(c, name, withBuildContext(c,
554
-			withFile("Dockerfile", fmt.Sprintf(`FROM busybox
553
+		buildImageSuccessfully(c, name, build.WithBuildContext(c,
554
+			build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
555 555
 %s
556 556
 RUN [ $(ls -l / | grep new_dir | awk '{print $3":"$4}') = 'root:root' ]`, tc)),
557
-			withFile("test_dir/test_file", "test file")))
557
+			build.WithFile("test_dir/test_file", "test file")))
558 558
 
559 559
 		dockerCmd(c, "rmi", name)
560 560
 	}
... ...
@@ -565,8 +567,8 @@ func (s *DockerSuite) TestBuildAddAndCopyFileWithWhitespace(c *check.C) {
565 565
 	name := "testaddfilewithwhitespace"
566 566
 
567 567
 	for _, command := range []string{"ADD", "COPY"} {
568
-		buildImageSuccessfully(c, name, withBuildContext(c,
569
-			withFile("Dockerfile", fmt.Sprintf(`FROM busybox
568
+		buildImageSuccessfully(c, name, build.WithBuildContext(c,
569
+			build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
570 570
 RUN mkdir "/test dir"
571 571
 RUN mkdir "/test_dir"
572 572
 %s [ "test file1", "/test_file1" ]
... ...
@@ -581,12 +583,12 @@ RUN [ $(cat "/test file3") = 'test3' ]
581 581
 RUN [ $(cat "/test_dir/test_file4") = 'test4' ]
582 582
 RUN [ $(cat "/test dir/test_file5") = 'test5' ]
583 583
 RUN [ $(cat "/test dir/test_file6") = 'test6' ]`, command, command, command, command, command, command)),
584
-			withFile("test file1", "test1"),
585
-			withFile("test_file2", "test2"),
586
-			withFile("test file3", "test3"),
587
-			withFile("test dir/test_file4", "test4"),
588
-			withFile("test_dir/test_file5", "test5"),
589
-			withFile("test dir/test_file6", "test6"),
584
+			build.WithFile("test file1", "test1"),
585
+			build.WithFile("test_file2", "test2"),
586
+			build.WithFile("test file3", "test3"),
587
+			build.WithFile("test dir/test_file4", "test4"),
588
+			build.WithFile("test_dir/test_file5", "test5"),
589
+			build.WithFile("test dir/test_file6", "test6"),
590 590
 		))
591 591
 
592 592
 		dockerCmd(c, "rmi", name)
... ...
@@ -612,26 +614,26 @@ RUN find "test5" "C:/test dir/test_file5"
612 612
 RUN find "test6" "C:/test dir/test_file6"`
613 613
 
614 614
 	name := "testcopyfilewithwhitespace"
615
-	buildImageSuccessfully(c, name, withBuildContext(c,
616
-		withFile("Dockerfile", dockerfile),
617
-		withFile("test file1", "test1"),
618
-		withFile("test_file2", "test2"),
619
-		withFile("test file3", "test3"),
620
-		withFile("test dir/test_file4", "test4"),
621
-		withFile("test_dir/test_file5", "test5"),
622
-		withFile("test dir/test_file6", "test6"),
615
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
616
+		build.WithFile("Dockerfile", dockerfile),
617
+		build.WithFile("test file1", "test1"),
618
+		build.WithFile("test_file2", "test2"),
619
+		build.WithFile("test file3", "test3"),
620
+		build.WithFile("test dir/test_file4", "test4"),
621
+		build.WithFile("test_dir/test_file5", "test5"),
622
+		build.WithFile("test dir/test_file6", "test6"),
623 623
 	))
624 624
 }
625 625
 
626 626
 func (s *DockerSuite) TestBuildCopyWildcard(c *check.C) {
627 627
 	name := "testcopywildcard"
628
-	server := fakeStorage(c, map[string]string{
628
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{
629 629
 		"robots.txt": "hello",
630 630
 		"index.html": "world",
631
-	})
631
+	}))
632 632
 	defer server.Close()
633 633
 
634
-	ctx := fakeContext(c, fmt.Sprintf(`FROM busybox
634
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(fmt.Sprintf(`FROM busybox
635 635
 	COPY file*.txt /tmp/
636 636
 	RUN ls /tmp/file1.txt /tmp/file2.txt
637 637
 	RUN [ "mkdir",  "/tmp1" ]
... ...
@@ -640,21 +642,21 @@ func (s *DockerSuite) TestBuildCopyWildcard(c *check.C) {
640 640
 	RUN [ "mkdir",  "/tmp2" ]
641 641
         ADD dir/*dir %s/robots.txt /tmp2/
642 642
 	RUN ls /tmp2/nest_nest_file /tmp2/robots.txt
643
-	`, server.URL()),
644
-		map[string]string{
643
+	`, server.URL())),
644
+		fakecontext.WithFiles(map[string]string{
645 645
 			"file1.txt":                     "test1",
646 646
 			"file2.txt":                     "test2",
647 647
 			"dir/nested_file":               "nested file",
648 648
 			"dir/nested_dir/nest_nest_file": "2 times nested",
649 649
 			"dirt": "dirty",
650
-		})
650
+		}))
651 651
 	defer ctx.Close()
652 652
 
653
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
653
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
654 654
 	id1 := getIDByName(c, name)
655 655
 
656 656
 	// Now make sure we use a cache the 2nd time
657
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
657
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
658 658
 	id2 := getIDByName(c, name)
659 659
 
660 660
 	if id1 != id2 {
... ...
@@ -674,25 +676,25 @@ func (s *DockerSuite) TestBuildCopyWildcardInName(c *check.C) {
674 674
 	// say which OSs this works on or not.
675 675
 	testRequires(c, DaemonIsLinux, UnixCli)
676 676
 
677
-	buildImageSuccessfully(c, "testcopywildcardinname", withBuildContext(c,
678
-		withFile("Dockerfile", `FROM busybox
677
+	buildImageSuccessfully(c, "testcopywildcardinname", build.WithBuildContext(c,
678
+		build.WithFile("Dockerfile", `FROM busybox
679 679
 	COPY *.txt /tmp/
680 680
 	RUN [ "$(cat /tmp/\*.txt)" = 'hi there' ]
681 681
 	`),
682
-		withFile("*.txt", "hi there"),
682
+		build.WithFile("*.txt", "hi there"),
683 683
 	))
684 684
 }
685 685
 
686 686
 func (s *DockerSuite) TestBuildCopyWildcardCache(c *check.C) {
687 687
 	name := "testcopywildcardcache"
688
-	ctx := fakeContext(c, `FROM busybox
689
-	COPY file1.txt /tmp/`,
690
-		map[string]string{
688
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(`FROM busybox
689
+	COPY file1.txt /tmp/`),
690
+		fakecontext.WithFiles(map[string]string{
691 691
 			"file1.txt": "test1",
692
-		})
692
+		}))
693 693
 	defer ctx.Close()
694 694
 
695
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
695
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
696 696
 	id1 := getIDByName(c, name)
697 697
 
698 698
 	// Now make sure we use a cache the 2nd time even with wild cards.
... ...
@@ -700,7 +702,7 @@ func (s *DockerSuite) TestBuildCopyWildcardCache(c *check.C) {
700 700
 	ctx.Add("Dockerfile", `FROM busybox
701 701
 	COPY file*.txt /tmp/`)
702 702
 
703
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
703
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
704 704
 	id2 := getIDByName(c, name)
705 705
 
706 706
 	if id1 != id2 {
... ...
@@ -711,8 +713,8 @@ func (s *DockerSuite) TestBuildCopyWildcardCache(c *check.C) {
711 711
 
712 712
 func (s *DockerSuite) TestBuildAddSingleFileToNonExistingDir(c *check.C) {
713 713
 	testRequires(c, DaemonIsLinux) // Linux specific test
714
-	buildImageSuccessfully(c, "testaddsinglefiletononexistingdir", withBuildContext(c,
715
-		withFile("Dockerfile", `FROM busybox
714
+	buildImageSuccessfully(c, "testaddsinglefiletononexistingdir", build.WithBuildContext(c,
715
+		build.WithFile("Dockerfile", `FROM busybox
716 716
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
717 717
 RUN echo 'dockerio:x:1001:' >> /etc/group
718 718
 RUN touch /exists
... ...
@@ -721,13 +723,13 @@ ADD test_file /test_dir/
721 721
 RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ]
722 722
 RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
723 723
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`),
724
-		withFile("test_file", "test1")))
724
+		build.WithFile("test_file", "test1")))
725 725
 }
726 726
 
727 727
 func (s *DockerSuite) TestBuildAddDirContentToRoot(c *check.C) {
728 728
 	testRequires(c, DaemonIsLinux) // Linux specific test
729
-	buildImageSuccessfully(c, "testadddircontenttoroot", withBuildContext(c,
730
-		withFile("Dockerfile", `FROM busybox
729
+	buildImageSuccessfully(c, "testadddircontenttoroot", build.WithBuildContext(c,
730
+		build.WithFile("Dockerfile", `FROM busybox
731 731
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
732 732
 RUN echo 'dockerio:x:1001:' >> /etc/group
733 733
 RUN touch /exists
... ...
@@ -735,13 +737,13 @@ RUN chown dockerio.dockerio exists
735 735
 ADD test_dir /
736 736
 RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
737 737
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`),
738
-		withFile("test_dir/test_file", "test1")))
738
+		build.WithFile("test_dir/test_file", "test1")))
739 739
 }
740 740
 
741 741
 func (s *DockerSuite) TestBuildAddDirContentToExistingDir(c *check.C) {
742 742
 	testRequires(c, DaemonIsLinux) // Linux specific test
743
-	buildImageSuccessfully(c, "testadddircontenttoexistingdir", withBuildContext(c,
744
-		withFile("Dockerfile", `FROM busybox
743
+	buildImageSuccessfully(c, "testadddircontenttoexistingdir", build.WithBuildContext(c,
744
+		build.WithFile("Dockerfile", `FROM busybox
745 745
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
746 746
 RUN echo 'dockerio:x:1001:' >> /etc/group
747 747
 RUN mkdir /exists
... ...
@@ -751,13 +753,13 @@ ADD test_dir/ /exists/
751 751
 RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
752 752
 RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
753 753
 RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]`),
754
-		withFile("test_dir/test_file", "test1")))
754
+		build.WithFile("test_dir/test_file", "test1")))
755 755
 }
756 756
 
757 757
 func (s *DockerSuite) TestBuildAddWholeDirToRoot(c *check.C) {
758 758
 	testRequires(c, DaemonIsLinux) // Linux specific test
759
-	buildImageSuccessfully(c, "testaddwholedirtoroot", withBuildContext(c,
760
-		withFile("Dockerfile", fmt.Sprintf(`FROM busybox
759
+	buildImageSuccessfully(c, "testaddwholedirtoroot", build.WithBuildContext(c,
760
+		build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
761 761
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
762 762
 RUN echo 'dockerio:x:1001:' >> /etc/group
763 763
 RUN touch /exists
... ...
@@ -768,39 +770,39 @@ RUN [ $(ls -l / | grep test_dir | awk '{print $1}') = 'drwxr-xr-x' ]
768 768
 RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
769 769
 RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '%s' ]
770 770
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod)),
771
-		withFile("test_dir/test_file", "test1")))
771
+		build.WithFile("test_dir/test_file", "test1")))
772 772
 }
773 773
 
774 774
 // Testing #5941 : Having an etc directory in context conflicts with the /etc/mtab
775 775
 func (s *DockerSuite) TestBuildAddOrCopyEtcToRootShouldNotConflict(c *check.C) {
776
-	buildImageSuccessfully(c, "testaddetctoroot", withBuildContext(c,
777
-		withFile("Dockerfile", `FROM `+minimalBaseImage()+`
776
+	buildImageSuccessfully(c, "testaddetctoroot", build.WithBuildContext(c,
777
+		build.WithFile("Dockerfile", `FROM `+minimalBaseImage()+`
778 778
 ADD . /`),
779
-		withFile("etc/test_file", "test1")))
780
-	buildImageSuccessfully(c, "testcopyetctoroot", withBuildContext(c,
781
-		withFile("Dockerfile", `FROM `+minimalBaseImage()+`
779
+		build.WithFile("etc/test_file", "test1")))
780
+	buildImageSuccessfully(c, "testcopyetctoroot", build.WithBuildContext(c,
781
+		build.WithFile("Dockerfile", `FROM `+minimalBaseImage()+`
782 782
 COPY . /`),
783
-		withFile("etc/test_file", "test1")))
783
+		build.WithFile("etc/test_file", "test1")))
784 784
 }
785 785
 
786 786
 // Testing #9401 : Losing setuid flag after a ADD
787 787
 func (s *DockerSuite) TestBuildAddPreservesFilesSpecialBits(c *check.C) {
788 788
 	testRequires(c, DaemonIsLinux) // Linux specific test
789
-	buildImageSuccessfully(c, "testaddetctoroot", withBuildContext(c,
790
-		withFile("Dockerfile", `FROM busybox
789
+	buildImageSuccessfully(c, "testaddetctoroot", build.WithBuildContext(c,
790
+		build.WithFile("Dockerfile", `FROM busybox
791 791
 ADD suidbin /usr/bin/suidbin
792 792
 RUN chmod 4755 /usr/bin/suidbin
793 793
 RUN [ $(ls -l /usr/bin/suidbin | awk '{print $1}') = '-rwsr-xr-x' ]
794 794
 ADD ./data/ /
795 795
 RUN [ $(ls -l /usr/bin/suidbin | awk '{print $1}') = '-rwsr-xr-x' ]`),
796
-		withFile("suidbin", "suidbin"),
797
-		withFile("/data/usr/test_file", "test1")))
796
+		build.WithFile("suidbin", "suidbin"),
797
+		build.WithFile("/data/usr/test_file", "test1")))
798 798
 }
799 799
 
800 800
 func (s *DockerSuite) TestBuildCopySingleFileToRoot(c *check.C) {
801 801
 	testRequires(c, DaemonIsLinux) // Linux specific test
802
-	buildImageSuccessfully(c, "testcopysinglefiletoroot", withBuildContext(c,
803
-		withFile("Dockerfile", fmt.Sprintf(`FROM busybox
802
+	buildImageSuccessfully(c, "testcopysinglefiletoroot", build.WithBuildContext(c,
803
+		build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
804 804
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
805 805
 RUN echo 'dockerio:x:1001:' >> /etc/group
806 806
 RUN touch /exists
... ...
@@ -809,22 +811,22 @@ COPY test_file /
809 809
 RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
810 810
 RUN [ $(ls -l /test_file | awk '{print $1}') = '%s' ]
811 811
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod)),
812
-		withFile("test_file", "test1")))
812
+		build.WithFile("test_file", "test1")))
813 813
 }
814 814
 
815 815
 // Issue #3960: "ADD src ." hangs - adapted for COPY
816 816
 func (s *DockerSuite) TestBuildCopySingleFileToWorkdir(c *check.C) {
817 817
 	name := "testcopysinglefiletoworkdir"
818
-	ctx := fakeContext(c, `FROM busybox
819
-COPY test_file .`,
820
-		map[string]string{
818
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(`FROM busybox
819
+COPY test_file .`),
820
+		fakecontext.WithFiles(map[string]string{
821 821
 			"test_file": "test1",
822
-		})
822
+		}))
823 823
 	defer ctx.Close()
824 824
 
825 825
 	errChan := make(chan error)
826 826
 	go func() {
827
-		errChan <- buildImage(name, withExternalBuildContext(ctx)).Error
827
+		errChan <- buildImage(name, build.WithExternalBuildContext(ctx)).Error
828 828
 		close(errChan)
829 829
 	}()
830 830
 	select {
... ...
@@ -837,8 +839,8 @@ COPY test_file .`,
837 837
 
838 838
 func (s *DockerSuite) TestBuildCopySingleFileToExistDir(c *check.C) {
839 839
 	testRequires(c, DaemonIsLinux) // Linux specific test
840
-	buildImageSuccessfully(c, "testcopysinglefiletoexistdir", withBuildContext(c,
841
-		withFile("Dockerfile", `FROM busybox
840
+	buildImageSuccessfully(c, "testcopysinglefiletoexistdir", build.WithBuildContext(c,
841
+		build.WithFile("Dockerfile", `FROM busybox
842 842
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
843 843
 RUN echo 'dockerio:x:1001:' >> /etc/group
844 844
 RUN mkdir /exists
... ...
@@ -848,13 +850,13 @@ COPY test_file /exists/
848 848
 RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
849 849
 RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]
850 850
 RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`),
851
-		withFile("test_file", "test1")))
851
+		build.WithFile("test_file", "test1")))
852 852
 }
853 853
 
854 854
 func (s *DockerSuite) TestBuildCopySingleFileToNonExistDir(c *check.C) {
855 855
 	testRequires(c, DaemonIsLinux) // Linux specific
856
-	buildImageSuccessfully(c, "testcopysinglefiletononexistdir", withBuildContext(c,
857
-		withFile("Dockerfile", `FROM busybox
856
+	buildImageSuccessfully(c, "testcopysinglefiletononexistdir", build.WithBuildContext(c,
857
+		build.WithFile("Dockerfile", `FROM busybox
858 858
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
859 859
 RUN echo 'dockerio:x:1001:' >> /etc/group
860 860
 RUN touch /exists
... ...
@@ -863,13 +865,13 @@ COPY test_file /test_dir/
863 863
 RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ]
864 864
 RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
865 865
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`),
866
-		withFile("test_file", "test1")))
866
+		build.WithFile("test_file", "test1")))
867 867
 }
868 868
 
869 869
 func (s *DockerSuite) TestBuildCopyDirContentToRoot(c *check.C) {
870 870
 	testRequires(c, DaemonIsLinux) // Linux specific test
871
-	buildImageSuccessfully(c, "testcopydircontenttoroot", withBuildContext(c,
872
-		withFile("Dockerfile", `FROM busybox
871
+	buildImageSuccessfully(c, "testcopydircontenttoroot", build.WithBuildContext(c,
872
+		build.WithFile("Dockerfile", `FROM busybox
873 873
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
874 874
 RUN echo 'dockerio:x:1001:' >> /etc/group
875 875
 RUN touch /exists
... ...
@@ -877,13 +879,13 @@ RUN chown dockerio.dockerio exists
877 877
 COPY test_dir /
878 878
 RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
879 879
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`),
880
-		withFile("test_dir/test_file", "test1")))
880
+		build.WithFile("test_dir/test_file", "test1")))
881 881
 }
882 882
 
883 883
 func (s *DockerSuite) TestBuildCopyDirContentToExistDir(c *check.C) {
884 884
 	testRequires(c, DaemonIsLinux) // Linux specific test
885
-	buildImageSuccessfully(c, "testcopydircontenttoexistdir", withBuildContext(c,
886
-		withFile("Dockerfile", `FROM busybox
885
+	buildImageSuccessfully(c, "testcopydircontenttoexistdir", build.WithBuildContext(c,
886
+		build.WithFile("Dockerfile", `FROM busybox
887 887
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
888 888
 RUN echo 'dockerio:x:1001:' >> /etc/group
889 889
 RUN mkdir /exists
... ...
@@ -893,13 +895,13 @@ COPY test_dir/ /exists/
893 893
 RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
894 894
 RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
895 895
 RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]`),
896
-		withFile("test_dir/test_file", "test1")))
896
+		build.WithFile("test_dir/test_file", "test1")))
897 897
 }
898 898
 
899 899
 func (s *DockerSuite) TestBuildCopyWholeDirToRoot(c *check.C) {
900 900
 	testRequires(c, DaemonIsLinux) // Linux specific test
901
-	buildImageSuccessfully(c, "testcopywholedirtoroot", withBuildContext(c,
902
-		withFile("Dockerfile", fmt.Sprintf(`FROM busybox
901
+	buildImageSuccessfully(c, "testcopywholedirtoroot", build.WithBuildContext(c,
902
+		build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
903 903
 RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
904 904
 RUN echo 'dockerio:x:1001:' >> /etc/group
905 905
 RUN touch /exists
... ...
@@ -910,7 +912,7 @@ RUN [ $(ls -l / | grep test_dir | awk '{print $1}') = 'drwxr-xr-x' ]
910 910
 RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
911 911
 RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '%s' ]
912 912
 RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod)),
913
-		withFile("test_dir/test_file", "test1")))
913
+		build.WithFile("test_dir/test_file", "test1")))
914 914
 }
915 915
 
916 916
 func (s *DockerSuite) TestBuildAddBadLinks(c *check.C) {
... ...
@@ -925,7 +927,7 @@ func (s *DockerSuite) TestBuildAddBadLinks(c *check.C) {
925 925
 	var (
926 926
 		name = "test-link-absolute"
927 927
 	)
928
-	ctx := fakeContext(c, dockerfile, nil)
928
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(dockerfile))
929 929
 	defer ctx.Close()
930 930
 
931 931
 	tempDir, err := ioutil.TempDir("", "test-link-absolute-temp-")
... ...
@@ -986,7 +988,7 @@ func (s *DockerSuite) TestBuildAddBadLinks(c *check.C) {
986 986
 		c.Fatal(err)
987 987
 	}
988 988
 
989
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
989
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
990 990
 	if _, err := os.Stat(nonExistingFile); err == nil || err != nil && !os.IsNotExist(err) {
991 991
 		c.Fatalf("%s shouldn't have been written and it shouldn't exist", nonExistingFile)
992 992
 	}
... ...
@@ -1017,7 +1019,7 @@ func (s *DockerSuite) TestBuildAddBadLinksVolume(c *check.C) {
1017 1017
 	dockerfile = fmt.Sprintf(dockerfileTemplate, tempDir)
1018 1018
 	nonExistingFile := filepath.Join(tempDir, targetFile)
1019 1019
 
1020
-	ctx := fakeContext(c, dockerfile, nil)
1020
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(dockerfile))
1021 1021
 	defer ctx.Close()
1022 1022
 	fooPath := filepath.Join(ctx.Dir, targetFile)
1023 1023
 
... ...
@@ -1031,7 +1033,7 @@ func (s *DockerSuite) TestBuildAddBadLinksVolume(c *check.C) {
1031 1031
 		c.Fatal(err)
1032 1032
 	}
1033 1033
 
1034
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1034
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
1035 1035
 	if _, err := os.Stat(nonExistingFile); err == nil || err != nil && !os.IsNotExist(err) {
1036 1036
 		c.Fatalf("%s shouldn't have been written and it shouldn't exist", nonExistingFile)
1037 1037
 	}
... ...
@@ -1045,7 +1047,10 @@ func (s *DockerSuite) TestBuildWithInaccessibleFilesInContext(c *check.C) {
1045 1045
 
1046 1046
 	{
1047 1047
 		name := "testbuildinaccessiblefiles"
1048
-		ctx := fakeContext(c, "FROM scratch\nADD . /foo/", map[string]string{"fileWithoutReadAccess": "foo"})
1048
+		ctx := fakecontext.New(c, "",
1049
+			fakecontext.WithDockerfile("FROM scratch\nADD . /foo/"),
1050
+			fakecontext.WithFiles(map[string]string{"fileWithoutReadAccess": "foo"}),
1051
+		)
1049 1052
 		defer ctx.Close()
1050 1053
 		// This is used to ensure we detect inaccessible files early during build in the cli client
1051 1054
 		pathToFileWithoutReadAccess := filepath.Join(ctx.Dir, "fileWithoutReadAccess")
... ...
@@ -1075,7 +1080,10 @@ func (s *DockerSuite) TestBuildWithInaccessibleFilesInContext(c *check.C) {
1075 1075
 	}
1076 1076
 	{
1077 1077
 		name := "testbuildinaccessibledirectory"
1078
-		ctx := fakeContext(c, "FROM scratch\nADD . /foo/", map[string]string{"directoryWeCantStat/bar": "foo"})
1078
+		ctx := fakecontext.New(c, "",
1079
+			fakecontext.WithDockerfile("FROM scratch\nADD . /foo/"),
1080
+			fakecontext.WithFiles(map[string]string{"directoryWeCantStat/bar": "foo"}),
1081
+		)
1079 1082
 		defer ctx.Close()
1080 1083
 		// This is used to ensure we detect inaccessible directories early during build in the cli client
1081 1084
 		pathToDirectoryWithoutReadAccess := filepath.Join(ctx.Dir, "directoryWeCantStat")
... ...
@@ -1111,7 +1119,7 @@ func (s *DockerSuite) TestBuildWithInaccessibleFilesInContext(c *check.C) {
1111 1111
 	}
1112 1112
 	{
1113 1113
 		name := "testlinksok"
1114
-		ctx := fakeContext(c, "FROM scratch\nADD . /foo/", nil)
1114
+		ctx := fakecontext.New(c, "", fakecontext.WithDockerfile("FROM scratch\nADD . /foo/"))
1115 1115
 		defer ctx.Close()
1116 1116
 
1117 1117
 		target := "../../../../../../../../../../../../../../../../../../../azA"
... ...
@@ -1121,15 +1129,17 @@ func (s *DockerSuite) TestBuildWithInaccessibleFilesInContext(c *check.C) {
1121 1121
 		defer os.Remove(target)
1122 1122
 		// This is used to ensure we don't follow links when checking if everything in the context is accessible
1123 1123
 		// This test doesn't require that we run commands as an unprivileged user
1124
-		buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1124
+		buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
1125 1125
 	}
1126 1126
 	{
1127 1127
 		name := "testbuildignoredinaccessible"
1128
-		ctx := fakeContext(c, "FROM scratch\nADD . /foo/",
1129
-			map[string]string{
1128
+		ctx := fakecontext.New(c, "",
1129
+			fakecontext.WithDockerfile("FROM scratch\nADD . /foo/"),
1130
+			fakecontext.WithFiles(map[string]string{
1130 1131
 				"directoryWeCantStat/bar": "foo",
1131 1132
 				".dockerignore":           "directoryWeCantStat",
1132
-			})
1133
+			}),
1134
+		)
1133 1135
 		defer ctx.Close()
1134 1136
 		// This is used to ensure we don't try to add inaccessible files when they are ignored by a .dockerignore pattern
1135 1137
 		pathToDirectoryWithoutReadAccess := filepath.Join(ctx.Dir, "directoryWeCantStat")
... ...
@@ -1157,8 +1167,8 @@ func (s *DockerSuite) TestBuildForceRm(c *check.C) {
1157 1157
 	containerCountBefore := getContainerCount(c)
1158 1158
 	name := "testbuildforcerm"
1159 1159
 
1160
-	buildImage(name, cli.WithFlags("--force-rm"), withBuildContext(c,
1161
-		withFile("Dockerfile", `FROM `+minimalBaseImage()+`
1160
+	buildImage(name, cli.WithFlags("--force-rm"), build.WithBuildContext(c,
1161
+		build.WithFile("Dockerfile", `FROM `+minimalBaseImage()+`
1162 1162
 	RUN true
1163 1163
 	RUN thiswillfail`))).Assert(c, icmd.Expected{
1164 1164
 		ExitCode: 1,
... ...
@@ -1335,8 +1345,8 @@ func (s *DockerSuite) TestBuildWindowsAddCopyPathProcessing(c *check.C) {
1335 1335
 	// support backslash such as .\\ being equivalent to ./ and c:\\ being
1336 1336
 	// equivalent to c:/. This is not currently (nor ever has been) supported
1337 1337
 	// by docker on the Windows platform.
1338
-	buildImageSuccessfully(c, "testbuildwindowsaddcopypathprocessing", withBuildContext(c,
1339
-		withFile("Dockerfile", `FROM busybox
1338
+	buildImageSuccessfully(c, "testbuildwindowsaddcopypathprocessing", build.WithBuildContext(c,
1339
+		build.WithFile("Dockerfile", `FROM busybox
1340 1340
 			# No trailing slash on COPY/ADD
1341 1341
 			# Results in dir being changed to a file
1342 1342
 			WORKDIR /wc1
... ...
@@ -1355,10 +1365,10 @@ func (s *DockerSuite) TestBuildWindowsAddCopyPathProcessing(c *check.C) {
1355 1355
 			RUN sh -c "[ $(cat c:/wd1/wd1) = 'hellowd1' ]"
1356 1356
 			RUN sh -c "[ $(cat c:/wd2/wd2) = 'worldwd2' ]"
1357 1357
 			`),
1358
-		withFile("wc1", "hellowc1"),
1359
-		withFile("wc2", "worldwc2"),
1360
-		withFile("wd1", "hellowd1"),
1361
-		withFile("wd2", "worldwd2"),
1358
+		build.WithFile("wc1", "hellowc1"),
1359
+		build.WithFile("wc2", "worldwc2"),
1360
+		build.WithFile("wd1", "hellowd1"),
1361
+		build.WithFile("wd2", "worldwd2"),
1362 1362
 	))
1363 1363
 }
1364 1364
 
... ...
@@ -1394,8 +1404,8 @@ func (s *DockerSuite) TestBuildRelativeCopy(c *check.C) {
1394 1394
 		expected = `/test1/test2`
1395 1395
 	}
1396 1396
 
1397
-	buildImageSuccessfully(c, "testbuildrelativecopy", withBuildContext(c,
1398
-		withFile("Dockerfile", `FROM busybox
1397
+	buildImageSuccessfully(c, "testbuildrelativecopy", build.WithBuildContext(c,
1398
+		build.WithFile("Dockerfile", `FROM busybox
1399 1399
 			WORKDIR /test1
1400 1400
 			WORKDIR test2
1401 1401
 			RUN sh -c "[ "$PWD" = '`+expected+`' ]"
... ...
@@ -1417,7 +1427,7 @@ func (s *DockerSuite) TestBuildRelativeCopy(c *check.C) {
1417 1417
 			COPY foo ../
1418 1418
 			RUN sh -c "[ $(cat /test5/foo) = 'hello' ]"
1419 1419
 			`),
1420
-		withFile("foo", "hello"),
1420
+		build.WithFile("foo", "hello"),
1421 1421
 	))
1422 1422
 }
1423 1423
 
... ...
@@ -1741,12 +1751,14 @@ func (s *DockerSuite) TestBuildConditionalCache(c *check.C) {
1741 1741
 	dockerfile := `
1742 1742
 		FROM busybox
1743 1743
         ADD foo /tmp/`
1744
-	ctx := fakeContext(c, dockerfile, map[string]string{
1745
-		"foo": "hello",
1746
-	})
1744
+	ctx := fakecontext.New(c, "",
1745
+		fakecontext.WithDockerfile(dockerfile),
1746
+		fakecontext.WithFiles(map[string]string{
1747
+			"foo": "hello",
1748
+		}))
1747 1749
 	defer ctx.Close()
1748 1750
 
1749
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1751
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
1750 1752
 	id1 := getIDByName(c, name)
1751 1753
 
1752 1754
 	if err := ctx.Add("foo", "bye"); err != nil {
... ...
@@ -1754,13 +1766,13 @@ func (s *DockerSuite) TestBuildConditionalCache(c *check.C) {
1754 1754
 	}
1755 1755
 
1756 1756
 	// Updating a file should invalidate the cache
1757
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1757
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
1758 1758
 	id2 := getIDByName(c, name)
1759 1759
 	if id2 == id1 {
1760 1760
 		c.Fatal("Should not have used the cache")
1761 1761
 	}
1762 1762
 
1763
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1763
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
1764 1764
 	id3 := getIDByName(c, name)
1765 1765
 	if id3 != id2 {
1766 1766
 		c.Fatal("Should have used the cache")
... ...
@@ -1775,15 +1787,15 @@ func (s *DockerSuite) TestBuildAddMultipleLocalFileWithAndWithoutCache(c *check.
1775 1775
         MAINTAINER dockerio
1776 1776
         ADD foo Dockerfile /usr/lib/bla/
1777 1777
 		RUN sh -c "[ $(cat /usr/lib/bla/foo) = "hello" ]"`
1778
-	ctx := fakeContext(c, dockerfile, map[string]string{
1778
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(dockerfile), fakecontext.WithFiles(map[string]string{
1779 1779
 		"foo": "hello",
1780
-	})
1780
+	}))
1781 1781
 	defer ctx.Close()
1782
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1782
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
1783 1783
 	id1 := getIDByName(c, name)
1784
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1784
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
1785 1785
 	id2 := getIDByName(c, name)
1786
-	buildImageSuccessfully(c, name, build.WithoutCache, withExternalBuildContext(ctx))
1786
+	cli.BuildCmd(c, name, build.WithoutCache, build.WithExternalBuildContext(ctx))
1787 1787
 	id3 := getIDByName(c, name)
1788 1788
 	if id1 != id2 {
1789 1789
 		c.Fatal("The cache should have been used but hasn't.")
... ...
@@ -1800,17 +1812,17 @@ func (s *DockerSuite) TestBuildCopyDirButNotFile(c *check.C) {
1800 1800
 	dockerfile := `
1801 1801
         FROM ` + minimalBaseImage() + `
1802 1802
         COPY dir /tmp/`
1803
-	ctx := fakeContext(c, dockerfile, map[string]string{
1803
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(dockerfile), fakecontext.WithFiles(map[string]string{
1804 1804
 		"dir/foo": "hello",
1805
-	})
1805
+	}))
1806 1806
 	defer ctx.Close()
1807
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1807
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
1808 1808
 	id1 := getIDByName(c, name)
1809 1809
 	// Check that adding file with similar name doesn't mess with cache
1810 1810
 	if err := ctx.Add("dir_file", "hello2"); err != nil {
1811 1811
 		c.Fatal(err)
1812 1812
 	}
1813
-	buildImageSuccessfully(c, name2, withExternalBuildContext(ctx))
1813
+	cli.BuildCmd(c, name2, build.WithExternalBuildContext(ctx))
1814 1814
 	id2 := getIDByName(c, name2)
1815 1815
 	if id1 != id2 {
1816 1816
 		c.Fatal("The cache should have been used but wasn't")
... ...
@@ -1826,17 +1838,17 @@ func (s *DockerSuite) TestBuildAddCurrentDirWithCache(c *check.C) {
1826 1826
         FROM ` + minimalBaseImage() + `
1827 1827
         MAINTAINER dockerio
1828 1828
         ADD . /usr/lib/bla`
1829
-	ctx := fakeContext(c, dockerfile, map[string]string{
1829
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(dockerfile), fakecontext.WithFiles(map[string]string{
1830 1830
 		"foo": "hello",
1831
-	})
1831
+	}))
1832 1832
 	defer ctx.Close()
1833
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1833
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
1834 1834
 	id1 := getIDByName(c, name)
1835 1835
 	// Check that adding file invalidate cache of "ADD ."
1836 1836
 	if err := ctx.Add("bar", "hello2"); err != nil {
1837 1837
 		c.Fatal(err)
1838 1838
 	}
1839
-	buildImageSuccessfully(c, name2, withExternalBuildContext(ctx))
1839
+	buildImageSuccessfully(c, name2, build.WithExternalBuildContext(ctx))
1840 1840
 	id2 := getIDByName(c, name2)
1841 1841
 	if id1 == id2 {
1842 1842
 		c.Fatal("The cache should have been invalided but hasn't.")
... ...
@@ -1845,7 +1857,7 @@ func (s *DockerSuite) TestBuildAddCurrentDirWithCache(c *check.C) {
1845 1845
 	if err := ctx.Add("foo", "hello1"); err != nil {
1846 1846
 		c.Fatal(err)
1847 1847
 	}
1848
-	buildImageSuccessfully(c, name3, withExternalBuildContext(ctx))
1848
+	buildImageSuccessfully(c, name3, build.WithExternalBuildContext(ctx))
1849 1849
 	id3 := getIDByName(c, name3)
1850 1850
 	if id2 == id3 {
1851 1851
 		c.Fatal("The cache should have been invalided but hasn't.")
... ...
@@ -1856,7 +1868,7 @@ func (s *DockerSuite) TestBuildAddCurrentDirWithCache(c *check.C) {
1856 1856
 	if err := ctx.Add("foo", "hello1"); err != nil {
1857 1857
 		c.Fatal(err)
1858 1858
 	}
1859
-	buildImageSuccessfully(c, name4, withExternalBuildContext(ctx))
1859
+	buildImageSuccessfully(c, name4, build.WithExternalBuildContext(ctx))
1860 1860
 	id4 := getIDByName(c, name4)
1861 1861
 	if id3 != id4 {
1862 1862
 		c.Fatal("The cache should have been used but hasn't.")
... ...
@@ -1870,13 +1882,13 @@ func (s *DockerSuite) TestBuildAddCurrentDirWithoutCache(c *check.C) {
1870 1870
         FROM ` + minimalBaseImage() + `
1871 1871
         MAINTAINER dockerio
1872 1872
         ADD . /usr/lib/bla`
1873
-	ctx := fakeContext(c, dockerfile, map[string]string{
1873
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(dockerfile), fakecontext.WithFiles(map[string]string{
1874 1874
 		"foo": "hello",
1875
-	})
1875
+	}))
1876 1876
 	defer ctx.Close()
1877
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1877
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
1878 1878
 	id1 := getIDByName(c, name)
1879
-	buildImageSuccessfully(c, name, build.WithoutCache, withExternalBuildContext(ctx))
1879
+	buildImageSuccessfully(c, name, build.WithoutCache, build.WithExternalBuildContext(ctx))
1880 1880
 	id2 := getIDByName(c, name)
1881 1881
 	if id1 == id2 {
1882 1882
 		c.Fatal("The cache should have been invalided but hasn't.")
... ...
@@ -1885,19 +1897,19 @@ func (s *DockerSuite) TestBuildAddCurrentDirWithoutCache(c *check.C) {
1885 1885
 
1886 1886
 func (s *DockerSuite) TestBuildAddRemoteFileWithAndWithoutCache(c *check.C) {
1887 1887
 	name := "testbuildaddremotefilewithcache"
1888
-	server := fakeStorage(c, map[string]string{
1888
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{
1889 1889
 		"baz": "hello",
1890
-	})
1890
+	}))
1891 1891
 	defer server.Close()
1892 1892
 
1893 1893
 	dockerfile := fmt.Sprintf(`FROM `+minimalBaseImage()+`
1894 1894
         MAINTAINER dockerio
1895 1895
         ADD %s/baz /usr/lib/baz/quux`, server.URL())
1896
-	buildImageSuccessfully(c, name, build.WithDockerfile(dockerfile))
1896
+	cli.BuildCmd(c, name, build.WithDockerfile(dockerfile))
1897 1897
 	id1 := getIDByName(c, name)
1898
-	buildImageSuccessfully(c, name, build.WithDockerfile(dockerfile))
1898
+	cli.BuildCmd(c, name, build.WithDockerfile(dockerfile))
1899 1899
 	id2 := getIDByName(c, name)
1900
-	buildImageSuccessfully(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
1900
+	cli.BuildCmd(c, name, build.WithoutCache, build.WithDockerfile(dockerfile))
1901 1901
 	id3 := getIDByName(c, name)
1902 1902
 
1903 1903
 	if id1 != id2 {
... ...
@@ -1914,17 +1926,17 @@ func (s *DockerSuite) TestBuildAddRemoteFileMTime(c *check.C) {
1914 1914
 	name3 := name + "3"
1915 1915
 
1916 1916
 	files := map[string]string{"baz": "hello"}
1917
-	server := fakeStorage(c, files)
1917
+	server := fakestorage.New(c, "", fakecontext.WithFiles(files))
1918 1918
 	defer server.Close()
1919 1919
 
1920
-	ctx := fakeContext(c, fmt.Sprintf(`FROM `+minimalBaseImage()+`
1920
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(fmt.Sprintf(`FROM `+minimalBaseImage()+`
1921 1921
         MAINTAINER dockerio
1922
-        ADD %s/baz /usr/lib/baz/quux`, server.URL()), nil)
1922
+        ADD %s/baz /usr/lib/baz/quux`, server.URL())))
1923 1923
 	defer ctx.Close()
1924 1924
 
1925
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1925
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
1926 1926
 	id1 := getIDByName(c, name)
1927
-	buildImageSuccessfully(c, name2, withExternalBuildContext(ctx))
1927
+	cli.BuildCmd(c, name2, build.WithExternalBuildContext(ctx))
1928 1928
 	id2 := getIDByName(c, name2)
1929 1929
 	if id1 != id2 {
1930 1930
 		c.Fatal("The cache should have been used but wasn't - #1")
... ...
@@ -1936,14 +1948,14 @@ func (s *DockerSuite) TestBuildAddRemoteFileMTime(c *check.C) {
1936 1936
 	// allow some time for clock to pass as mtime precision is only 1s
1937 1937
 	time.Sleep(2 * time.Second)
1938 1938
 
1939
-	server2 := fakeStorage(c, files)
1939
+	server2 := fakestorage.New(c, "", fakecontext.WithFiles(files))
1940 1940
 	defer server2.Close()
1941 1941
 
1942
-	ctx2 := fakeContext(c, fmt.Sprintf(`FROM `+minimalBaseImage()+`
1942
+	ctx2 := fakecontext.New(c, "", fakecontext.WithDockerfile(fmt.Sprintf(`FROM `+minimalBaseImage()+`
1943 1943
         MAINTAINER dockerio
1944
-        ADD %s/baz /usr/lib/baz/quux`, server2.URL()), nil)
1944
+        ADD %s/baz /usr/lib/baz/quux`, server2.URL())))
1945 1945
 	defer ctx2.Close()
1946
-	buildImageSuccessfully(c, name3, withExternalBuildContext(ctx2))
1946
+	cli.BuildCmd(c, name3, build.WithExternalBuildContext(ctx2))
1947 1947
 	id3 := getIDByName(c, name3)
1948 1948
 	if id1 != id3 {
1949 1949
 		c.Fatal("The cache should have been used but wasn't")
... ...
@@ -1953,24 +1965,24 @@ func (s *DockerSuite) TestBuildAddRemoteFileMTime(c *check.C) {
1953 1953
 // FIXME(vdemeester) this really seems to test the same thing as before (combined)
1954 1954
 func (s *DockerSuite) TestBuildAddLocalAndRemoteFilesWithAndWithoutCache(c *check.C) {
1955 1955
 	name := "testbuildaddlocalandremotefilewithcache"
1956
-	server := fakeStorage(c, map[string]string{
1956
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{
1957 1957
 		"baz": "hello",
1958
-	})
1958
+	}))
1959 1959
 	defer server.Close()
1960 1960
 
1961
-	ctx := fakeContext(c, fmt.Sprintf(`FROM `+minimalBaseImage()+`
1961
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(fmt.Sprintf(`FROM `+minimalBaseImage()+`
1962 1962
         MAINTAINER dockerio
1963 1963
         ADD foo /usr/lib/bla/bar
1964
-        ADD %s/baz /usr/lib/baz/quux`, server.URL()),
1965
-		map[string]string{
1964
+        ADD %s/baz /usr/lib/baz/quux`, server.URL())),
1965
+		fakecontext.WithFiles(map[string]string{
1966 1966
 			"foo": "hello world",
1967
-		})
1967
+		}))
1968 1968
 	defer ctx.Close()
1969
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1969
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
1970 1970
 	id1 := getIDByName(c, name)
1971
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
1971
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
1972 1972
 	id2 := getIDByName(c, name)
1973
-	buildImageSuccessfully(c, name, build.WithoutCache, withExternalBuildContext(ctx))
1973
+	buildImageSuccessfully(c, name, build.WithoutCache, build.WithExternalBuildContext(ctx))
1974 1974
 	id3 := getIDByName(c, name)
1975 1975
 	if id1 != id2 {
1976 1976
 		c.Fatal("The cache should have been used but hasn't.")
... ...
@@ -1981,13 +1993,13 @@ func (s *DockerSuite) TestBuildAddLocalAndRemoteFilesWithAndWithoutCache(c *chec
1981 1981
 }
1982 1982
 
1983 1983
 func testContextTar(c *check.C, compression archive.Compression) {
1984
-	ctx := fakeContext(c,
1985
-		`FROM busybox
1984
+	ctx := fakecontext.New(c, "",
1985
+		fakecontext.WithDockerfile(`FROM busybox
1986 1986
 ADD foo /foo
1987
-CMD ["cat", "/foo"]`,
1988
-		map[string]string{
1987
+CMD ["cat", "/foo"]`),
1988
+		fakecontext.WithFiles(map[string]string{
1989 1989
 			"foo": "bar",
1990
-		},
1990
+		}),
1991 1991
 	)
1992 1992
 	defer ctx.Close()
1993 1993
 	context, err := archive.Tar(ctx.Dir, compression)
... ...
@@ -1996,10 +2008,7 @@ CMD ["cat", "/foo"]`,
1996 1996
 	}
1997 1997
 	name := "contexttar"
1998 1998
 
1999
-	icmd.RunCmd(icmd.Cmd{
2000
-		Command: []string{dockerBinary, "build", "-t", name, "-"},
2001
-		Stdin:   context,
2002
-	}).Assert(c, icmd.Success)
1999
+	cli.BuildCmd(c, name, build.WithStdinContext(context))
2003 2000
 }
2004 2001
 
2005 2002
 func (s *DockerSuite) TestBuildContextTarGzip(c *check.C) {
... ...
@@ -2130,12 +2139,12 @@ func (s *DockerSuite) TestBuildEntrypointRunCleanup(c *check.C) {
2130 2130
 	buildImageSuccessfully(c, name, build.WithDockerfile(`FROM busybox
2131 2131
         RUN echo "hello"`))
2132 2132
 
2133
-	buildImageSuccessfully(c, name, withBuildContext(c,
2134
-		withFile("Dockerfile", `FROM busybox
2133
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2134
+		build.WithFile("Dockerfile", `FROM busybox
2135 2135
         RUN echo "hello"
2136 2136
         ADD foo /foo
2137 2137
         ENTRYPOINT ["/bin/echo"]`),
2138
-		withFile("foo", "hello")))
2138
+		build.WithFile("foo", "hello")))
2139 2139
 
2140 2140
 	res := inspectField(c, name, "Config.Cmd")
2141 2141
 	// Cmd must be cleaned up
... ...
@@ -2152,10 +2161,10 @@ func (s *DockerSuite) TestBuildAddFileNotFound(c *check.C) {
2152 2152
 		expected = "foo: The system cannot find the file specified"
2153 2153
 	}
2154 2154
 
2155
-	buildImage(name, withBuildContext(c,
2156
-		withFile("Dockerfile", `FROM `+minimalBaseImage()+`
2155
+	buildImage(name, build.WithBuildContext(c,
2156
+		build.WithFile("Dockerfile", `FROM `+minimalBaseImage()+`
2157 2157
         ADD foo /usr/local/bar`),
2158
-		withFile("bar", "hello"))).Assert(c, icmd.Expected{
2158
+		build.WithFile("bar", "hello"))).Assert(c, icmd.Expected{
2159 2159
 		ExitCode: 1,
2160 2160
 		Err:      expected,
2161 2161
 	})
... ...
@@ -2206,15 +2215,15 @@ func (s *DockerSuite) TestBuildAddToSymlinkDest(c *check.C) {
2206 2206
 		makeLink = `mklink /D C:\bar C:\foo`
2207 2207
 	}
2208 2208
 	name := "testbuildaddtosymlinkdest"
2209
-	buildImageSuccessfully(c, name, withBuildContext(c,
2210
-		withFile("Dockerfile", `
2209
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2210
+		build.WithFile("Dockerfile", `
2211 2211
 		FROM busybox
2212 2212
 		RUN sh -c "mkdir /foo"
2213 2213
 		RUN `+makeLink+`
2214 2214
 		ADD foo /bar/
2215 2215
 		RUN sh -c "[ -f /bar/foo ]"
2216 2216
 		RUN sh -c "[ -f /foo/foo ]"`),
2217
-		withFile("foo", "hello"),
2217
+		build.WithFile("foo", "hello"),
2218 2218
 	))
2219 2219
 }
2220 2220
 
... ...
@@ -2253,8 +2262,8 @@ func (s *DockerSuite) TestBuildVerifyIntString(c *check.C) {
2253 2253
 
2254 2254
 func (s *DockerSuite) TestBuildDockerignore(c *check.C) {
2255 2255
 	name := "testbuilddockerignore"
2256
-	buildImageSuccessfully(c, name, withBuildContext(c,
2257
-		withFile("Dockerfile", `
2256
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2257
+		build.WithFile("Dockerfile", `
2258 2258
 		FROM busybox
2259 2259
 		 ADD . /bla
2260 2260
 		RUN sh -c "[[ -f /bla/src/x.go ]]"
... ...
@@ -2268,17 +2277,17 @@ func (s *DockerSuite) TestBuildDockerignore(c *check.C) {
2268 2268
 		RUN sh -c "[[ ! -e v.cc ]]"
2269 2269
 		RUN sh -c "[[ ! -e src/v.cc ]]"
2270 2270
 		RUN sh -c "[[ ! -e src/_vendor/v.cc ]]"`),
2271
-		withFile("Makefile", "all:"),
2272
-		withFile(".git/HEAD", "ref: foo"),
2273
-		withFile("src/x.go", "package main"),
2274
-		withFile("src/_vendor/v.go", "package main"),
2275
-		withFile("src/_vendor/v.cc", "package main"),
2276
-		withFile("src/v.cc", "package main"),
2277
-		withFile("v.cc", "package main"),
2278
-		withFile("dir/foo", ""),
2279
-		withFile(".gitignore", ""),
2280
-		withFile("README.md", "readme"),
2281
-		withFile(".dockerignore", `
2271
+		build.WithFile("Makefile", "all:"),
2272
+		build.WithFile(".git/HEAD", "ref: foo"),
2273
+		build.WithFile("src/x.go", "package main"),
2274
+		build.WithFile("src/_vendor/v.go", "package main"),
2275
+		build.WithFile("src/_vendor/v.cc", "package main"),
2276
+		build.WithFile("src/v.cc", "package main"),
2277
+		build.WithFile("v.cc", "package main"),
2278
+		build.WithFile("dir/foo", ""),
2279
+		build.WithFile(".gitignore", ""),
2280
+		build.WithFile("README.md", "readme"),
2281
+		build.WithFile(".dockerignore", `
2282 2282
 .git
2283 2283
 pkg
2284 2284
 .gitignore
... ...
@@ -2291,22 +2300,22 @@ dir`),
2291 2291
 
2292 2292
 func (s *DockerSuite) TestBuildDockerignoreCleanPaths(c *check.C) {
2293 2293
 	name := "testbuilddockerignorecleanpaths"
2294
-	buildImageSuccessfully(c, name, withBuildContext(c,
2295
-		withFile("Dockerfile", `
2294
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2295
+		build.WithFile("Dockerfile", `
2296 2296
         FROM busybox
2297 2297
         ADD . /tmp/
2298 2298
         RUN sh -c "(! ls /tmp/foo) && (! ls /tmp/foo2) && (! ls /tmp/dir1/foo)"`),
2299
-		withFile("foo", "foo"),
2300
-		withFile("foo2", "foo2"),
2301
-		withFile("dir1/foo", "foo in dir1"),
2302
-		withFile(".dockerignore", "./foo\ndir1//foo\n./dir1/../foo2"),
2299
+		build.WithFile("foo", "foo"),
2300
+		build.WithFile("foo2", "foo2"),
2301
+		build.WithFile("dir1/foo", "foo in dir1"),
2302
+		build.WithFile(".dockerignore", "./foo\ndir1//foo\n./dir1/../foo2"),
2303 2303
 	))
2304 2304
 }
2305 2305
 
2306 2306
 func (s *DockerSuite) TestBuildDockerignoreExceptions(c *check.C) {
2307 2307
 	name := "testbuilddockerignoreexceptions"
2308
-	buildImageSuccessfully(c, name, withBuildContext(c,
2309
-		withFile("Dockerfile", `
2308
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2309
+		build.WithFile("Dockerfile", `
2310 2310
 		FROM busybox
2311 2311
 		ADD . /bla
2312 2312
 		RUN sh -c "[[ -f /bla/src/x.go ]]"
... ...
@@ -2321,20 +2330,20 @@ func (s *DockerSuite) TestBuildDockerignoreExceptions(c *check.C) {
2321 2321
 		RUN sh -c "[[ ! -e /bla/foo ]]"
2322 2322
 		RUN sh -c "[[ ! -e /bla/.git ]]"
2323 2323
 		RUN sh -c "[[ -e /bla/dir/a.cc ]]"`),
2324
-		withFile("Makefile", "all:"),
2325
-		withFile(".git/HEAD", "ref: foo"),
2326
-		withFile("src/x.go", "package main"),
2327
-		withFile("src/_vendor/v.go", "package main"),
2328
-		withFile("dir/foo", ""),
2329
-		withFile("dir/foo1", ""),
2330
-		withFile("dir/dir/f1", ""),
2331
-		withFile("dir/dir/foo", ""),
2332
-		withFile("dir/e", ""),
2333
-		withFile("dir/e-dir/foo", ""),
2334
-		withFile(".gitignore", ""),
2335
-		withFile("README.md", "readme"),
2336
-		withFile("dir/a.cc", "hello"),
2337
-		withFile(".dockerignore", `
2324
+		build.WithFile("Makefile", "all:"),
2325
+		build.WithFile(".git/HEAD", "ref: foo"),
2326
+		build.WithFile("src/x.go", "package main"),
2327
+		build.WithFile("src/_vendor/v.go", "package main"),
2328
+		build.WithFile("dir/foo", ""),
2329
+		build.WithFile("dir/foo1", ""),
2330
+		build.WithFile("dir/dir/f1", ""),
2331
+		build.WithFile("dir/dir/foo", ""),
2332
+		build.WithFile("dir/e", ""),
2333
+		build.WithFile("dir/e-dir/foo", ""),
2334
+		build.WithFile(".gitignore", ""),
2335
+		build.WithFile("README.md", "readme"),
2336
+		build.WithFile("dir/a.cc", "hello"),
2337
+		build.WithFile(".dockerignore", `
2338 2338
 .git
2339 2339
 pkg
2340 2340
 .gitignore
... ...
@@ -2355,13 +2364,13 @@ func (s *DockerSuite) TestBuildDockerignoringDockerfile(c *check.C) {
2355 2355
 		ADD . /tmp/
2356 2356
 		RUN sh -c "! ls /tmp/Dockerfile"
2357 2357
 		RUN ls /tmp/.dockerignore`
2358
-	buildImageSuccessfully(c, name, withBuildContext(c,
2359
-		withFile("Dockerfile", dockerfile),
2360
-		withFile(".dockerignore", "Dockerfile\n"),
2358
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2359
+		build.WithFile("Dockerfile", dockerfile),
2360
+		build.WithFile(".dockerignore", "Dockerfile\n"),
2361 2361
 	))
2362
-	buildImageSuccessfully(c, name, withBuildContext(c,
2363
-		withFile("Dockerfile", dockerfile),
2364
-		withFile(".dockerignore", "./Dockerfile\n"),
2362
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2363
+		build.WithFile("Dockerfile", dockerfile),
2364
+		build.WithFile(".dockerignore", "./Dockerfile\n"),
2365 2365
 	))
2366 2366
 }
2367 2367
 
... ...
@@ -2373,15 +2382,15 @@ func (s *DockerSuite) TestBuildDockerignoringRenamedDockerfile(c *check.C) {
2373 2373
 		RUN ls /tmp/Dockerfile
2374 2374
 		RUN sh -c "! ls /tmp/MyDockerfile"
2375 2375
 		RUN ls /tmp/.dockerignore`
2376
-	buildImageSuccessfully(c, name, cli.WithFlags("-f", "MyDockerfile"), withBuildContext(c,
2377
-		withFile("Dockerfile", "Should not use me"),
2378
-		withFile("MyDockerfile", dockerfile),
2379
-		withFile(".dockerignore", "MyDockerfile\n"),
2376
+	buildImageSuccessfully(c, name, cli.WithFlags("-f", "MyDockerfile"), build.WithBuildContext(c,
2377
+		build.WithFile("Dockerfile", "Should not use me"),
2378
+		build.WithFile("MyDockerfile", dockerfile),
2379
+		build.WithFile(".dockerignore", "MyDockerfile\n"),
2380 2380
 	))
2381
-	buildImageSuccessfully(c, name, cli.WithFlags("-f", "MyDockerfile"), withBuildContext(c,
2382
-		withFile("Dockerfile", "Should not use me"),
2383
-		withFile("MyDockerfile", dockerfile),
2384
-		withFile(".dockerignore", "./MyDockerfile\n"),
2381
+	buildImageSuccessfully(c, name, cli.WithFlags("-f", "MyDockerfile"), build.WithBuildContext(c,
2382
+		build.WithFile("Dockerfile", "Should not use me"),
2383
+		build.WithFile("MyDockerfile", dockerfile),
2384
+		build.WithFile(".dockerignore", "./MyDockerfile\n"),
2385 2385
 	))
2386 2386
 }
2387 2387
 
... ...
@@ -2392,9 +2401,9 @@ func (s *DockerSuite) TestBuildDockerignoringDockerignore(c *check.C) {
2392 2392
 		ADD . /tmp/
2393 2393
 		RUN sh -c "! ls /tmp/.dockerignore"
2394 2394
 		RUN ls /tmp/Dockerfile`
2395
-	buildImageSuccessfully(c, name, withBuildContext(c,
2396
-		withFile("Dockerfile", dockerfile),
2397
-		withFile(".dockerignore", ".dockerignore\n"),
2395
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2396
+		build.WithFile("Dockerfile", dockerfile),
2397
+		build.WithFile(".dockerignore", ".dockerignore\n"),
2398 2398
 	))
2399 2399
 }
2400 2400
 
... ...
@@ -2403,16 +2412,17 @@ func (s *DockerSuite) TestBuildDockerignoreTouchDockerfile(c *check.C) {
2403 2403
 	dockerfile := `
2404 2404
         FROM busybox
2405 2405
 		ADD . /tmp/`
2406
-	ctx := fakeContext(c, dockerfile, map[string]string{
2407
-		"Dockerfile":    dockerfile,
2408
-		".dockerignore": "Dockerfile\n",
2409
-	})
2406
+	ctx := fakecontext.New(c, "",
2407
+		fakecontext.WithDockerfile(dockerfile),
2408
+		fakecontext.WithFiles(map[string]string{
2409
+			".dockerignore": "Dockerfile\n",
2410
+		}))
2410 2411
 	defer ctx.Close()
2411 2412
 
2412
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
2413
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
2413 2414
 	id1 := getIDByName(c, name)
2414 2415
 
2415
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
2416
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
2416 2417
 	id2 := getIDByName(c, name)
2417 2418
 	if id1 != id2 {
2418 2419
 		c.Fatalf("Didn't use the cache - 1")
... ...
@@ -2422,7 +2432,7 @@ func (s *DockerSuite) TestBuildDockerignoreTouchDockerfile(c *check.C) {
2422 2422
 	if err := ctx.Add("Dockerfile", dockerfile+"\n# hi"); err != nil {
2423 2423
 		c.Fatalf("Didn't add Dockerfile: %s", err)
2424 2424
 	}
2425
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
2425
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
2426 2426
 	id2 = getIDByName(c, name)
2427 2427
 	if id1 != id2 {
2428 2428
 		c.Fatalf("Didn't use the cache - 2")
... ...
@@ -2432,7 +2442,7 @@ func (s *DockerSuite) TestBuildDockerignoreTouchDockerfile(c *check.C) {
2432 2432
 	if err := ctx.Add("Dockerfile", dockerfile+"\n# hi"); err != nil {
2433 2433
 		c.Fatalf("Didn't add Dockerfile: %s", err)
2434 2434
 	}
2435
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
2435
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
2436 2436
 	id2 = getIDByName(c, name)
2437 2437
 	if id1 != id2 {
2438 2438
 		c.Fatalf("Didn't use the cache - 3")
... ...
@@ -2448,11 +2458,11 @@ func (s *DockerSuite) TestBuildDockerignoringWholeDir(c *check.C) {
2448 2448
 		RUN sh -c "[[ ! -e /.gitignore ]]"
2449 2449
 		RUN sh -c "[[ ! -e /Makefile ]]"`
2450 2450
 
2451
-	buildImageSuccessfully(c, name, withBuildContext(c,
2452
-		withFile("Dockerfile", dockerfile),
2453
-		withFile(".dockerignore", "*\n"),
2454
-		withFile("Makefile", "all:"),
2455
-		withFile(".gitignore", ""),
2451
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2452
+		build.WithFile("Dockerfile", dockerfile),
2453
+		build.WithFile(".dockerignore", "*\n"),
2454
+		build.WithFile("Makefile", "all:"),
2455
+		build.WithFile(".gitignore", ""),
2456 2456
 	))
2457 2457
 }
2458 2458
 
... ...
@@ -2465,25 +2475,25 @@ func (s *DockerSuite) TestBuildDockerignoringOnlyDotfiles(c *check.C) {
2465 2465
 		RUN sh -c "[[ ! -e /.gitignore ]]"
2466 2466
 		RUN sh -c "[[ -f /Makefile ]]"`
2467 2467
 
2468
-	buildImageSuccessfully(c, name, withBuildContext(c,
2469
-		withFile("Dockerfile", dockerfile),
2470
-		withFile(".dockerignore", ".*"),
2471
-		withFile("Makefile", "all:"),
2472
-		withFile(".gitignore", ""),
2468
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2469
+		build.WithFile("Dockerfile", dockerfile),
2470
+		build.WithFile(".dockerignore", ".*"),
2471
+		build.WithFile("Makefile", "all:"),
2472
+		build.WithFile(".gitignore", ""),
2473 2473
 	))
2474 2474
 }
2475 2475
 
2476 2476
 func (s *DockerSuite) TestBuildDockerignoringBadExclusion(c *check.C) {
2477 2477
 	name := "testbuilddockerignorebadexclusion"
2478
-	buildImage(name, withBuildContext(c,
2479
-		withFile("Dockerfile", `
2478
+	buildImage(name, build.WithBuildContext(c,
2479
+		build.WithFile("Dockerfile", `
2480 2480
 		FROM busybox
2481 2481
 		COPY . /
2482 2482
 		RUN sh -c "[[ ! -e /.gitignore ]]"
2483 2483
 		RUN sh -c "[[ -f /Makefile ]]"`),
2484
-		withFile("Makefile", "all:"),
2485
-		withFile(".gitignore", ""),
2486
-		withFile(".dockerignore", "!\n"),
2484
+		build.WithFile("Makefile", "all:"),
2485
+		build.WithFile(".gitignore", ""),
2486
+		build.WithFile(".dockerignore", "!\n"),
2487 2487
 	)).Assert(c, icmd.Expected{
2488 2488
 		ExitCode: 1,
2489 2489
 		Err:      "Error checking context: 'illegal exclusion pattern: \"!\"",
... ...
@@ -2501,11 +2511,11 @@ func (s *DockerSuite) TestBuildDockerignoringWildTopDir(c *check.C) {
2501 2501
 
2502 2502
 	// All of these should result in ignoring all files
2503 2503
 	for _, variant := range []string{"**", "**/", "**/**", "*"} {
2504
-		buildImageSuccessfully(c, "noname", withBuildContext(c,
2505
-			withFile("Dockerfile", dockerfile),
2506
-			withFile("file1", ""),
2507
-			withFile("dir/file1", ""),
2508
-			withFile(".dockerignore", variant),
2504
+		buildImageSuccessfully(c, "noname", build.WithBuildContext(c,
2505
+			build.WithFile("Dockerfile", dockerfile),
2506
+			build.WithFile("file1", ""),
2507
+			build.WithFile("dir/file1", ""),
2508
+			build.WithFile(".dockerignore", variant),
2509 2509
 		))
2510 2510
 
2511 2511
 		dockerCmd(c, "rmi", "noname")
... ...
@@ -2553,25 +2563,25 @@ dir1/dir3/**
2553 2553
 **/dir5/file.
2554 2554
 `
2555 2555
 
2556
-	buildImageSuccessfully(c, "noname", withBuildContext(c,
2557
-		withFile("Dockerfile", dockerfile),
2558
-		withFile(".dockerignore", dockerignore),
2559
-		withFile("dir1/file0", ""),
2560
-		withFile("dir1/dir2/file0", ""),
2561
-		withFile("file1", ""),
2562
-		withFile("dir1/file1", ""),
2563
-		withFile("dir1/dir2/file1", ""),
2564
-		withFile("dir1/file2", ""),
2565
-		withFile("dir1/dir2/file2", ""), // remains
2566
-		withFile("dir1/dir2/file4", ""),
2567
-		withFile("dir1/dir2/file5", ""),
2568
-		withFile("dir1/dir2/file6", ""),
2569
-		withFile("dir1/dir3/file7", ""),
2570
-		withFile("dir1/dir3/file8", ""),
2571
-		withFile("dir1/dir4/file9", ""),
2572
-		withFile("dir1/dir5/fileAA", ""),
2573
-		withFile("dir1/dir5/fileAB", ""),
2574
-		withFile("dir1/dir5/fileB", ""),
2556
+	buildImageSuccessfully(c, "noname", build.WithBuildContext(c,
2557
+		build.WithFile("Dockerfile", dockerfile),
2558
+		build.WithFile(".dockerignore", dockerignore),
2559
+		build.WithFile("dir1/file0", ""),
2560
+		build.WithFile("dir1/dir2/file0", ""),
2561
+		build.WithFile("file1", ""),
2562
+		build.WithFile("dir1/file1", ""),
2563
+		build.WithFile("dir1/dir2/file1", ""),
2564
+		build.WithFile("dir1/file2", ""),
2565
+		build.WithFile("dir1/dir2/file2", ""), // remains
2566
+		build.WithFile("dir1/dir2/file4", ""),
2567
+		build.WithFile("dir1/dir2/file5", ""),
2568
+		build.WithFile("dir1/dir2/file6", ""),
2569
+		build.WithFile("dir1/dir3/file7", ""),
2570
+		build.WithFile("dir1/dir3/file8", ""),
2571
+		build.WithFile("dir1/dir4/file9", ""),
2572
+		build.WithFile("dir1/dir5/fileAA", ""),
2573
+		build.WithFile("dir1/dir5/fileAB", ""),
2574
+		build.WithFile("dir1/dir5/fileB", ""),
2575 2575
 	))
2576 2576
 }
2577 2577
 
... ...
@@ -2691,9 +2701,9 @@ ENV    abc=def
2691 2691
 ENV    ghi=$abc
2692 2692
 RUN    [ "$ghi" = "def" ]
2693 2693
 `
2694
-	buildImageSuccessfully(c, name, withBuildContext(c,
2695
-		withFile("Dockerfile", dockerfile),
2696
-		withFile("hello/docker/world", "hello"),
2694
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2695
+		build.WithFile("Dockerfile", dockerfile),
2696
+		build.WithFile("hello/docker/world", "hello"),
2697 2697
 	))
2698 2698
 }
2699 2699
 
... ...
@@ -2761,9 +2771,9 @@ ENV    eee4 'foo'
2761 2761
 RUN    [ "$eee1,$eee2,$eee3,$eee4" = 'foo,foo,foo,foo' ]
2762 2762
 
2763 2763
 `
2764
-	buildImageSuccessfully(c, name, withBuildContext(c,
2765
-		withFile("Dockerfile", dockerfile),
2766
-		withFile("hello/docker/world", "hello"),
2764
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2765
+		build.WithFile("Dockerfile", dockerfile),
2766
+		build.WithFile("hello/docker/world", "hello"),
2767 2767
 	))
2768 2768
 }
2769 2769
 
... ...
@@ -2777,9 +2787,9 @@ RUN ["chmod","+x","/test"]
2777 2777
 RUN ["/test"]
2778 2778
 RUN [ "$(cat /testfile)" = 'test!' ]`
2779 2779
 
2780
-	buildImageSuccessfully(c, name, withBuildContext(c,
2781
-		withFile("Dockerfile", dockerfile),
2782
-		withFile("test", "#!/bin/sh\necho 'test!' > /testfile"),
2780
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2781
+		build.WithFile("Dockerfile", dockerfile),
2782
+		build.WithFile("test", "#!/bin/sh\necho 'test!' > /testfile"),
2783 2783
 	))
2784 2784
 }
2785 2785
 
... ...
@@ -2788,7 +2798,7 @@ func (s *DockerSuite) TestBuildAddTar(c *check.C) {
2788 2788
 	testRequires(c, NotUserNamespace)
2789 2789
 	name := "testbuildaddtar"
2790 2790
 
2791
-	ctx := func() *FakeContext {
2791
+	ctx := func() *fakecontext.Fake {
2792 2792
 		dockerfile := `
2793 2793
 FROM busybox
2794 2794
 ADD test.tar /
... ...
@@ -2830,17 +2840,17 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi`
2830 2830
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
2831 2831
 			c.Fatalf("failed to open destination dockerfile: %v", err)
2832 2832
 		}
2833
-		return fakeContextFromDir(tmpDir)
2833
+		return fakecontext.New(c, tmpDir)
2834 2834
 	}()
2835 2835
 	defer ctx.Close()
2836 2836
 
2837
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
2837
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
2838 2838
 }
2839 2839
 
2840 2840
 func (s *DockerSuite) TestBuildAddBrokenTar(c *check.C) {
2841 2841
 	name := "testbuildaddbrokentar"
2842 2842
 
2843
-	ctx := func() *FakeContext {
2843
+	ctx := func() *fakecontext.Fake {
2844 2844
 		dockerfile := `
2845 2845
 FROM busybox
2846 2846
 ADD test.tar /`
... ...
@@ -2879,11 +2889,11 @@ ADD test.tar /`
2879 2879
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
2880 2880
 			c.Fatalf("failed to open destination dockerfile: %v", err)
2881 2881
 		}
2882
-		return fakeContextFromDir(tmpDir)
2882
+		return fakecontext.New(c, tmpDir)
2883 2883
 	}()
2884 2884
 	defer ctx.Close()
2885 2885
 
2886
-	buildImage(name, withExternalBuildContext(ctx)).Assert(c, icmd.Expected{
2886
+	buildImage(name, build.WithExternalBuildContext(ctx)).Assert(c, icmd.Expected{
2887 2887
 		ExitCode: 1,
2888 2888
 	})
2889 2889
 }
... ...
@@ -2892,12 +2902,12 @@ func (s *DockerSuite) TestBuildAddNonTar(c *check.C) {
2892 2892
 	name := "testbuildaddnontar"
2893 2893
 
2894 2894
 	// Should not try to extract test.tar
2895
-	buildImageSuccessfully(c, name, withBuildContext(c,
2896
-		withFile("Dockerfile", `
2895
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
2896
+		build.WithFile("Dockerfile", `
2897 2897
 		FROM busybox
2898 2898
 		ADD test.tar /
2899 2899
 		RUN test -f /test.tar`),
2900
-		withFile("test.tar", "not_a_tar_file"),
2900
+		build.WithFile("test.tar", "not_a_tar_file"),
2901 2901
 	))
2902 2902
 }
2903 2903
 
... ...
@@ -2907,7 +2917,7 @@ func (s *DockerSuite) TestBuildAddTarXz(c *check.C) {
2907 2907
 	testRequires(c, DaemonIsLinux)
2908 2908
 	name := "testbuildaddtarxz"
2909 2909
 
2910
-	ctx := func() *FakeContext {
2910
+	ctx := func() *fakecontext.Fake {
2911 2911
 		dockerfile := `
2912 2912
 			FROM busybox
2913 2913
 			ADD test.tar.xz /
... ...
@@ -2942,19 +2952,19 @@ func (s *DockerSuite) TestBuildAddTarXz(c *check.C) {
2942 2942
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
2943 2943
 			c.Fatalf("failed to open destination dockerfile: %v", err)
2944 2944
 		}
2945
-		return fakeContextFromDir(tmpDir)
2945
+		return fakecontext.New(c, tmpDir)
2946 2946
 	}()
2947 2947
 
2948 2948
 	defer ctx.Close()
2949 2949
 
2950
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
2950
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
2951 2951
 }
2952 2952
 
2953 2953
 func (s *DockerSuite) TestBuildAddTarXzGz(c *check.C) {
2954 2954
 	testRequires(c, DaemonIsLinux)
2955 2955
 	name := "testbuildaddtarxzgz"
2956 2956
 
2957
-	ctx := func() *FakeContext {
2957
+	ctx := func() *fakecontext.Fake {
2958 2958
 		dockerfile := `
2959 2959
 			FROM busybox
2960 2960
 			ADD test.tar.xz.gz /
... ...
@@ -2994,12 +3004,12 @@ func (s *DockerSuite) TestBuildAddTarXzGz(c *check.C) {
2994 2994
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
2995 2995
 			c.Fatalf("failed to open destination dockerfile: %v", err)
2996 2996
 		}
2997
-		return fakeContextFromDir(tmpDir)
2997
+		return fakecontext.New(c, tmpDir)
2998 2998
 	}()
2999 2999
 
3000 3000
 	defer ctx.Close()
3001 3001
 
3002
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
3002
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
3003 3003
 }
3004 3004
 
3005 3005
 func (s *DockerSuite) TestBuildFromGit(c *check.C) {
... ...
@@ -3075,12 +3085,12 @@ func (s *DockerSuite) TestBuildFromRemoteTarball(c *check.C) {
3075 3075
 		c.Fatalf("failed to close tar archive: %v", err)
3076 3076
 	}
3077 3077
 
3078
-	server := fakeBinaryStorage(c, map[string]*bytes.Buffer{
3078
+	server := fakestorage.New(c, "", fakecontext.WithBinaryFiles(map[string]*bytes.Buffer{
3079 3079
 		"testT.tar": buffer,
3080
-	})
3080
+	}))
3081 3081
 	defer server.Close()
3082 3082
 
3083
-	buildImageSuccessfully(c, name, build.WithContextPath(server.URL()+"/testT.tar"))
3083
+	cli.BuildCmd(c, name, build.WithContextPath(server.URL()+"/testT.tar"))
3084 3084
 
3085 3085
 	res := inspectField(c, name, "Author")
3086 3086
 	if res != "docker" {
... ...
@@ -3398,9 +3408,9 @@ func (s *DockerSuite) TestBuildNotVerboseSuccess(c *check.C) {
3398 3398
 		{
3399 3399
 			Name: "quiet_build_ctx_success",
3400 3400
 			BuildFunc: func(name string) *icmd.Result {
3401
-				return buildImage(name, buildFlags, withBuildContext(c,
3402
-					withFile("Dockerfile", "FROM busybox"),
3403
-					withFile("quiet_build_success_fctx", "test"),
3401
+				return buildImage(name, buildFlags, build.WithBuildContext(c,
3402
+					build.WithFile("Dockerfile", "FROM busybox"),
3403
+					build.WithFile("quiet_build_success_fctx", "test"),
3404 3404
 				))
3405 3405
 			},
3406 3406
 		},
... ...
@@ -3518,21 +3528,23 @@ func (s *DockerSuite) TestBuildChownSingleFile(c *check.C) {
3518 3518
 
3519 3519
 	name := "testbuildchownsinglefile"
3520 3520
 
3521
-	ctx := fakeContext(c, `
3521
+	ctx := fakecontext.New(c, "",
3522
+		fakecontext.WithDockerfile(`
3522 3523
 FROM busybox
3523 3524
 COPY test /
3524 3525
 RUN ls -l /test
3525 3526
 RUN [ $(ls -l /test | awk '{print $3":"$4}') = 'root:root' ]
3526
-`, map[string]string{
3527
-		"test": "test",
3528
-	})
3527
+`),
3528
+		fakecontext.WithFiles(map[string]string{
3529
+			"test": "test",
3530
+		}))
3529 3531
 	defer ctx.Close()
3530 3532
 
3531 3533
 	if err := os.Chown(filepath.Join(ctx.Dir, "test"), 4242, 4242); err != nil {
3532 3534
 		c.Fatal(err)
3533 3535
 	}
3534 3536
 
3535
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
3537
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
3536 3538
 }
3537 3539
 
3538 3540
 func (s *DockerSuite) TestBuildSymlinkBreakout(c *check.C) {
... ...
@@ -3577,7 +3589,7 @@ func (s *DockerSuite) TestBuildSymlinkBreakout(c *check.C) {
3577 3577
 	w.Close()
3578 3578
 	f.Close()
3579 3579
 
3580
-	buildImageSuccessfully(c, name, build.WithoutCache, withExternalBuildContext(fakeContextFromDir(ctx)))
3580
+	buildImageSuccessfully(c, name, build.WithoutCache, build.WithExternalBuildContext(fakecontext.New(c, ctx)))
3581 3581
 	if _, err := os.Lstat(filepath.Join(tmpdir, "inject")); err == nil {
3582 3582
 		c.Fatal("symlink breakout - inject")
3583 3583
 	} else if !os.IsNotExist(err) {
... ...
@@ -3591,15 +3603,15 @@ func (s *DockerSuite) TestBuildXZHost(c *check.C) {
3591 3591
 	testRequires(c, DaemonIsLinux)
3592 3592
 	name := "testbuildxzhost"
3593 3593
 
3594
-	buildImageSuccessfully(c, name, withBuildContext(c,
3595
-		withFile("Dockerfile", `
3594
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
3595
+		build.WithFile("Dockerfile", `
3596 3596
 FROM busybox
3597 3597
 ADD xz /usr/local/sbin/
3598 3598
 RUN chmod 755 /usr/local/sbin/xz
3599 3599
 ADD test.xz /
3600 3600
 RUN [ ! -e /injected ]`),
3601
-		withFile("test.xz", "\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00"+"\x21\x01\x16\x00\x00\x00\x74\x2f\xe5\xa3\x01\x00\x3f\xfd"+"\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00\x21"),
3602
-		withFile("xz", "#!/bin/sh\ntouch /injected"),
3601
+		build.WithFile("test.xz", "\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00"+"\x21\x01\x16\x00\x00\x00\x74\x2f\xe5\xa3\x01\x00\x3f\xfd"+"\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00\x21"),
3602
+		build.WithFile("xz", "#!/bin/sh\ntouch /injected"),
3603 3603
 	))
3604 3604
 }
3605 3605
 
... ...
@@ -3617,13 +3629,13 @@ func (s *DockerSuite) TestBuildVolumesRetainContents(c *check.C) {
3617 3617
 		volName = "C:/foo"
3618 3618
 	}
3619 3619
 
3620
-	buildImageSuccessfully(c, name, withBuildContext(c,
3621
-		withFile("Dockerfile", `
3620
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
3621
+		build.WithFile("Dockerfile", `
3622 3622
 FROM busybox
3623 3623
 COPY content /foo/file
3624 3624
 VOLUME `+volName+`
3625 3625
 CMD cat /foo/file`),
3626
-		withFile("content", expected),
3626
+		build.WithFile("content", expected),
3627 3627
 	))
3628 3628
 
3629 3629
 	out, _ := dockerCmd(c, "run", "--rm", name)
... ...
@@ -3635,15 +3647,13 @@ CMD cat /foo/file`),
3635 3635
 
3636 3636
 // FIXME(vdemeester) part of this should be unit test, other part should be clearer
3637 3637
 func (s *DockerSuite) TestBuildRenamedDockerfile(c *check.C) {
3638
-	ctx := fakeContext(c, `FROM busybox
3639
-	RUN echo from Dockerfile`,
3640
-		map[string]string{
3641
-			"Dockerfile":       "FROM busybox\nRUN echo from Dockerfile",
3642
-			"files/Dockerfile": "FROM busybox\nRUN echo from files/Dockerfile",
3643
-			"files/dFile":      "FROM busybox\nRUN echo from files/dFile",
3644
-			"dFile":            "FROM busybox\nRUN echo from dFile",
3645
-			"files/dFile2":     "FROM busybox\nRUN echo from files/dFile2",
3646
-		})
3638
+	ctx := fakecontext.New(c, "", fakecontext.WithFiles(map[string]string{
3639
+		"Dockerfile":       "FROM busybox\nRUN echo from Dockerfile",
3640
+		"files/Dockerfile": "FROM busybox\nRUN echo from files/Dockerfile",
3641
+		"files/dFile":      "FROM busybox\nRUN echo from files/dFile",
3642
+		"dFile":            "FROM busybox\nRUN echo from dFile",
3643
+		"files/dFile2":     "FROM busybox\nRUN echo from files/dFile2",
3644
+	}))
3647 3645
 	defer ctx.Close()
3648 3646
 
3649 3647
 	cli.Docker(cli.Args("build", "-t", "test1", "."), cli.InDir(ctx.Dir)).Assert(c, icmd.Expected{
... ...
@@ -3701,18 +3711,18 @@ func (s *DockerSuite) TestBuildFromMixedcaseDockerfile(c *check.C) {
3701 3701
 	testRequires(c, DaemonIsLinux)
3702 3702
 
3703 3703
 	// If Dockerfile is not present, use dockerfile
3704
-	buildImage("test1", withBuildContext(c,
3705
-		withFile("dockerfile", `FROM busybox
3704
+	buildImage("test1", build.WithBuildContext(c,
3705
+		build.WithFile("dockerfile", `FROM busybox
3706 3706
 	RUN echo from dockerfile`),
3707 3707
 	)).Assert(c, icmd.Expected{
3708 3708
 		Out: "from dockerfile",
3709 3709
 	})
3710 3710
 
3711 3711
 	// Prefer Dockerfile in place of dockerfile
3712
-	buildImage("test1", withBuildContext(c,
3713
-		withFile("dockerfile", `FROM busybox
3712
+	buildImage("test1", build.WithBuildContext(c,
3713
+		build.WithFile("dockerfile", `FROM busybox
3714 3714
 	RUN echo from dockerfile`),
3715
-		withFile("Dockerfile", `FROM busybox
3715
+		build.WithFile("Dockerfile", `FROM busybox
3716 3716
 	RUN echo from Dockerfile`),
3717 3717
 	)).Assert(c, icmd.Expected{
3718 3718
 		Out: "from Dockerfile",
... ...
@@ -3720,24 +3730,22 @@ func (s *DockerSuite) TestBuildFromMixedcaseDockerfile(c *check.C) {
3720 3720
 }
3721 3721
 
3722 3722
 func (s *DockerSuite) TestBuildFromURLWithF(c *check.C) {
3723
-	server := fakeStorage(c, map[string]string{"baz": `FROM busybox
3723
+	server := fakestorage.New(c, "", fakecontext.WithFiles(map[string]string{"baz": `FROM busybox
3724 3724
 RUN echo from baz
3725 3725
 COPY * /tmp/
3726
-RUN find /tmp/`})
3726
+RUN find /tmp/`}))
3727 3727
 	defer server.Close()
3728 3728
 
3729
-	ctx := fakeContext(c, `FROM busybox
3730
-RUN echo from Dockerfile`,
3731
-		map[string]string{})
3729
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(`FROM busybox
3730
+	RUN echo from Dockerfile`))
3732 3731
 	defer ctx.Close()
3733 3732
 
3734 3733
 	// Make sure that -f is ignored and that we don't use the Dockerfile
3735 3734
 	// that's in the current dir
3736
-	result := buildImage("test1", cli.WithFlags("-f", "baz", server.URL()+"/baz"), func(cmd *icmd.Cmd) func() {
3735
+	result := cli.BuildCmd(c, "test1", cli.WithFlags("-f", "baz", server.URL()+"/baz"), func(cmd *icmd.Cmd) func() {
3737 3736
 		cmd.Dir = ctx.Dir
3738 3737
 		return nil
3739 3738
 	})
3740
-	result.Assert(c, icmd.Success)
3741 3739
 
3742 3740
 	if !strings.Contains(result.Combined(), "from baz") ||
3743 3741
 		strings.Contains(result.Combined(), "/tmp/baz") ||
... ...
@@ -3749,14 +3757,13 @@ RUN echo from Dockerfile`,
3749 3749
 
3750 3750
 func (s *DockerSuite) TestBuildFromStdinWithF(c *check.C) {
3751 3751
 	testRequires(c, DaemonIsLinux) // TODO Windows: This test is flaky; no idea why
3752
-	ctx := fakeContext(c, `FROM busybox
3753
-RUN echo "from Dockerfile"`,
3754
-		map[string]string{})
3752
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(`FROM busybox
3753
+RUN echo "from Dockerfile"`))
3755 3754
 	defer ctx.Close()
3756 3755
 
3757 3756
 	// Make sure that -f is ignored and that we don't use the Dockerfile
3758 3757
 	// that's in the current dir
3759
-	result := buildImage("test1", cli.WithFlags("-f", "baz", "-"), func(cmd *icmd.Cmd) func() {
3758
+	result := cli.BuildCmd(c, "test1", cli.WithFlags("-f", "baz", "-"), func(cmd *icmd.Cmd) func() {
3760 3759
 		cmd.Dir = ctx.Dir
3761 3760
 		cmd.Stdin = strings.NewReader(`FROM busybox
3762 3761
 RUN echo "from baz"
... ...
@@ -3764,7 +3771,6 @@ COPY * /tmp/
3764 3764
 RUN sh -c "find /tmp/" # sh -c is needed on Windows to use the correct find`)
3765 3765
 		return nil
3766 3766
 	})
3767
-	result.Assert(c, icmd.Success)
3768 3767
 
3769 3768
 	if !strings.Contains(result.Combined(), "from baz") ||
3770 3769
 		strings.Contains(result.Combined(), "/tmp/baz") ||
... ...
@@ -3851,19 +3857,16 @@ func (s *DockerSuite) TestBuildSpaces(c *check.C) {
3851 3851
 	// Test to make sure that leading/trailing spaces on a command
3852 3852
 	// doesn't change the error msg we get
3853 3853
 	name := "testspaces"
3854
-	ctx := fakeContext(c, "FROM busybox\nCOPY\n",
3855
-		map[string]string{
3856
-			"Dockerfile": "FROM busybox\nCOPY\n",
3857
-		})
3854
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile("FROM busybox\nCOPY\n"))
3858 3855
 	defer ctx.Close()
3859 3856
 
3860
-	result1 := buildImage(name, withExternalBuildContext(ctx))
3857
+	result1 := cli.Docker(cli.Build(name), build.WithExternalBuildContext(ctx))
3861 3858
 	result1.Assert(c, icmd.Expected{
3862 3859
 		ExitCode: 1,
3863 3860
 	})
3864 3861
 
3865 3862
 	ctx.Add("Dockerfile", "FROM busybox\nCOPY    ")
3866
-	result2 := buildImage(name, withExternalBuildContext(ctx))
3863
+	result2 := cli.Docker(cli.Build(name), build.WithExternalBuildContext(ctx))
3867 3864
 	result2.Assert(c, icmd.Expected{
3868 3865
 		ExitCode: 1,
3869 3866
 	})
... ...
@@ -3882,7 +3885,7 @@ func (s *DockerSuite) TestBuildSpaces(c *check.C) {
3882 3882
 	}
3883 3883
 
3884 3884
 	ctx.Add("Dockerfile", "FROM busybox\n   COPY")
3885
-	result2 = buildImage(name, build.WithoutCache, withExternalBuildContext(ctx))
3885
+	result2 = cli.Docker(cli.Build(name), build.WithoutCache, build.WithExternalBuildContext(ctx))
3886 3886
 	result2.Assert(c, icmd.Expected{
3887 3887
 		ExitCode: 1,
3888 3888
 	})
... ...
@@ -3897,7 +3900,7 @@ func (s *DockerSuite) TestBuildSpaces(c *check.C) {
3897 3897
 	}
3898 3898
 
3899 3899
 	ctx.Add("Dockerfile", "FROM busybox\n   COPY    ")
3900
-	result2 = buildImage(name, build.WithoutCache, withExternalBuildContext(ctx))
3900
+	result2 = cli.Docker(cli.Build(name), build.WithoutCache, build.WithExternalBuildContext(ctx))
3901 3901
 	result2.Assert(c, icmd.Expected{
3902 3902
 		ExitCode: 1,
3903 3903
 	})
... ...
@@ -4000,9 +4003,9 @@ func (s *DockerSuite) TestBuildEmptyScratch(c *check.C) {
4000 4000
 }
4001 4001
 
4002 4002
 func (s *DockerSuite) TestBuildDotDotFile(c *check.C) {
4003
-	buildImageSuccessfully(c, "sc", withBuildContext(c,
4004
-		withFile("Dockerfile", "FROM busybox\n"),
4005
-		withFile("..gitme", ""),
4003
+	buildImageSuccessfully(c, "sc", build.WithBuildContext(c,
4004
+		build.WithFile("Dockerfile", "FROM busybox\n"),
4005
+		build.WithFile("..gitme", ""),
4006 4006
 	))
4007 4007
 }
4008 4008
 
... ...
@@ -4248,16 +4251,16 @@ func (s *DockerSuite) TestBuildNullStringInAddCopyVolume(c *check.C) {
4248 4248
 		volName = `C:\\nullvolume`
4249 4249
 	}
4250 4250
 
4251
-	buildImageSuccessfully(c, name, withBuildContext(c,
4252
-		withFile("Dockerfile", `
4251
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
4252
+		build.WithFile("Dockerfile", `
4253 4253
 		FROM busybox
4254 4254
 
4255 4255
 		ADD null /
4256 4256
 		COPY nullfile /
4257 4257
 		VOLUME `+volName+`
4258 4258
 		`),
4259
-		withFile("null", "test1"),
4260
-		withFile("nullfile", "test2"),
4259
+		build.WithFile("null", "test1"),
4260
+		build.WithFile("nullfile", "test2"),
4261 4261
 	))
4262 4262
 }
4263 4263
 
... ...
@@ -4528,8 +4531,8 @@ func (s *DockerSuite) TestBuildBuildTimeArgExpansion(c *check.C) {
4528 4528
 			"--build-arg", fmt.Sprintf("%s=%s", userVar, userVal),
4529 4529
 			"--build-arg", fmt.Sprintf("%s=%s", volVar, volVal),
4530 4530
 		),
4531
-		withBuildContext(c,
4532
-			withFile("Dockerfile", fmt.Sprintf(`FROM busybox
4531
+		build.WithBuildContext(c,
4532
+			build.WithFile("Dockerfile", fmt.Sprintf(`FROM busybox
4533 4533
 		ARG %s
4534 4534
 		WORKDIR ${%s}
4535 4535
 		ARG %s
... ...
@@ -4546,8 +4549,8 @@ func (s *DockerSuite) TestBuildBuildTimeArgExpansion(c *check.C) {
4546 4546
 		VOLUME ${%s}`,
4547 4547
 				wdVar, wdVar, addVar, addVar, copyVar, copyVar, envVar, envVar,
4548 4548
 				envVar, exposeVar, exposeVar, userVar, userVar, volVar, volVar)),
4549
-			withFile(addVal, "some stuff"),
4550
-			withFile(copyVal, "some stuff"),
4549
+			build.WithFile(addVal, "some stuff"),
4550
+			build.WithFile(copyVal, "some stuff"),
4551 4551
 		),
4552 4552
 	)
4553 4553
 
... ...
@@ -4745,8 +4748,8 @@ func (s *DockerSuite) TestBuildBuildTimeArgEnv(c *check.C) {
4745 4745
 			"FOO1=fromenv",
4746 4746
 			"FOO2=fromenv",
4747 4747
 			"FOO3=fromenv")...),
4748
-		withBuildContext(c,
4749
-			withFile("Dockerfile", dockerfile),
4748
+		build.WithBuildContext(c,
4749
+			build.WithFile("Dockerfile", dockerfile),
4750 4750
 		),
4751 4751
 	)
4752 4752
 	result.Assert(c, icmd.Success)
... ...
@@ -4941,26 +4944,26 @@ func (s *DockerSuite) TestBuildMultipleTags(c *check.C) {
4941 4941
 // #17290
4942 4942
 func (s *DockerSuite) TestBuildCacheBrokenSymlink(c *check.C) {
4943 4943
 	name := "testbuildbrokensymlink"
4944
-	ctx := fakeContext(c, `
4944
+	ctx := fakecontext.New(c, "",
4945
+		fakecontext.WithDockerfile(`
4945 4946
 	FROM busybox
4946
-	COPY . ./`,
4947
-		map[string]string{
4947
+	COPY . ./`),
4948
+		fakecontext.WithFiles(map[string]string{
4948 4949
 			"foo": "bar",
4949
-		})
4950
+		}))
4950 4951
 	defer ctx.Close()
4951 4952
 
4952 4953
 	err := os.Symlink(filepath.Join(ctx.Dir, "nosuchfile"), filepath.Join(ctx.Dir, "asymlink"))
4953 4954
 	c.Assert(err, checker.IsNil)
4954 4955
 
4955 4956
 	// warm up cache
4956
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
4957
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
4957 4958
 
4958 4959
 	// add new file to context, should invalidate cache
4959 4960
 	err = ioutil.WriteFile(filepath.Join(ctx.Dir, "newfile"), []byte("foo"), 0644)
4960 4961
 	c.Assert(err, checker.IsNil)
4961 4962
 
4962
-	result := buildImage(name, withExternalBuildContext(ctx))
4963
-	result.Assert(c, icmd.Success)
4963
+	result := cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
4964 4964
 	if strings.Contains(result.Combined(), "Using cache") {
4965 4965
 		c.Fatal("2nd build used cache on ADD, it shouldn't")
4966 4966
 	}
... ...
@@ -4968,62 +4971,62 @@ func (s *DockerSuite) TestBuildCacheBrokenSymlink(c *check.C) {
4968 4968
 
4969 4969
 func (s *DockerSuite) TestBuildFollowSymlinkToFile(c *check.C) {
4970 4970
 	name := "testbuildbrokensymlink"
4971
-	ctx := fakeContext(c, `
4971
+	ctx := fakecontext.New(c, "",
4972
+		fakecontext.WithDockerfile(`
4972 4973
 	FROM busybox
4973
-	COPY asymlink target`,
4974
-		map[string]string{
4974
+	COPY asymlink target`),
4975
+		fakecontext.WithFiles(map[string]string{
4975 4976
 			"foo": "bar",
4976
-		})
4977
+		}))
4977 4978
 	defer ctx.Close()
4978 4979
 
4979 4980
 	err := os.Symlink("foo", filepath.Join(ctx.Dir, "asymlink"))
4980 4981
 	c.Assert(err, checker.IsNil)
4981 4982
 
4982
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
4983
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
4983 4984
 
4984
-	out, _ := dockerCmd(c, "run", "--rm", name, "cat", "target")
4985
+	out := cli.DockerCmd(c, "run", "--rm", name, "cat", "target").Combined()
4985 4986
 	c.Assert(out, checker.Matches, "bar")
4986 4987
 
4987 4988
 	// change target file should invalidate cache
4988 4989
 	err = ioutil.WriteFile(filepath.Join(ctx.Dir, "foo"), []byte("baz"), 0644)
4989 4990
 	c.Assert(err, checker.IsNil)
4990 4991
 
4991
-	result := buildImage(name, withExternalBuildContext(ctx))
4992
-	result.Assert(c, icmd.Success)
4992
+	result := cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
4993 4993
 	c.Assert(result.Combined(), checker.Not(checker.Contains), "Using cache")
4994 4994
 
4995
-	out, _ = dockerCmd(c, "run", "--rm", name, "cat", "target")
4995
+	out = cli.DockerCmd(c, "run", "--rm", name, "cat", "target").Combined()
4996 4996
 	c.Assert(out, checker.Matches, "baz")
4997 4997
 }
4998 4998
 
4999 4999
 func (s *DockerSuite) TestBuildFollowSymlinkToDir(c *check.C) {
5000 5000
 	name := "testbuildbrokensymlink"
5001
-	ctx := fakeContext(c, `
5001
+	ctx := fakecontext.New(c, "",
5002
+		fakecontext.WithDockerfile(`
5002 5003
 	FROM busybox
5003
-	COPY asymlink /`,
5004
-		map[string]string{
5004
+	COPY asymlink /`),
5005
+		fakecontext.WithFiles(map[string]string{
5005 5006
 			"foo/abc": "bar",
5006 5007
 			"foo/def": "baz",
5007
-		})
5008
+		}))
5008 5009
 	defer ctx.Close()
5009 5010
 
5010 5011
 	err := os.Symlink("foo", filepath.Join(ctx.Dir, "asymlink"))
5011 5012
 	c.Assert(err, checker.IsNil)
5012 5013
 
5013
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
5014
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
5014 5015
 
5015
-	out, _ := dockerCmd(c, "run", "--rm", name, "cat", "abc", "def")
5016
+	out := cli.DockerCmd(c, "run", "--rm", name, "cat", "abc", "def").Combined()
5016 5017
 	c.Assert(out, checker.Matches, "barbaz")
5017 5018
 
5018 5019
 	// change target file should invalidate cache
5019 5020
 	err = ioutil.WriteFile(filepath.Join(ctx.Dir, "foo/def"), []byte("bax"), 0644)
5020 5021
 	c.Assert(err, checker.IsNil)
5021 5022
 
5022
-	result := buildImage(name, withExternalBuildContext(ctx))
5023
-	result.Assert(c, icmd.Success)
5023
+	result := cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
5024 5024
 	c.Assert(result.Combined(), checker.Not(checker.Contains), "Using cache")
5025 5025
 
5026
-	out, _ = dockerCmd(c, "run", "--rm", name, "cat", "abc", "def")
5026
+	out = cli.DockerCmd(c, "run", "--rm", name, "cat", "abc", "def").Combined()
5027 5027
 	c.Assert(out, checker.Matches, "barbax")
5028 5028
 
5029 5029
 }
... ...
@@ -5032,43 +5035,44 @@ func (s *DockerSuite) TestBuildFollowSymlinkToDir(c *check.C) {
5032 5032
 // not from the target file.
5033 5033
 func (s *DockerSuite) TestBuildSymlinkBasename(c *check.C) {
5034 5034
 	name := "testbuildbrokensymlink"
5035
-	ctx := fakeContext(c, `
5035
+	ctx := fakecontext.New(c, "",
5036
+		fakecontext.WithDockerfile(`
5036 5037
 	FROM busybox
5037
-	COPY asymlink /`,
5038
-		map[string]string{
5038
+	COPY asymlink /`),
5039
+		fakecontext.WithFiles(map[string]string{
5039 5040
 			"foo": "bar",
5040
-		})
5041
+		}))
5041 5042
 	defer ctx.Close()
5042 5043
 
5043 5044
 	err := os.Symlink("foo", filepath.Join(ctx.Dir, "asymlink"))
5044 5045
 	c.Assert(err, checker.IsNil)
5045 5046
 
5046
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
5047
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
5047 5048
 
5048
-	out, _ := dockerCmd(c, "run", "--rm", name, "cat", "asymlink")
5049
+	out := cli.DockerCmd(c, "run", "--rm", name, "cat", "asymlink").Combined()
5049 5050
 	c.Assert(out, checker.Matches, "bar")
5050 5051
 }
5051 5052
 
5052 5053
 // #17827
5053 5054
 func (s *DockerSuite) TestBuildCacheRootSource(c *check.C) {
5054 5055
 	name := "testbuildrootsource"
5055
-	ctx := fakeContext(c, `
5056
+	ctx := fakecontext.New(c, "",
5057
+		fakecontext.WithDockerfile(`
5056 5058
 	FROM busybox
5057
-	COPY / /data`,
5058
-		map[string]string{
5059
+	COPY / /data`),
5060
+		fakecontext.WithFiles(map[string]string{
5059 5061
 			"foo": "bar",
5060
-		})
5062
+		}))
5061 5063
 	defer ctx.Close()
5062 5064
 
5063 5065
 	// warm up cache
5064
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
5066
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
5065 5067
 
5066 5068
 	// change file, should invalidate cache
5067 5069
 	err := ioutil.WriteFile(filepath.Join(ctx.Dir, "foo"), []byte("baz"), 0644)
5068 5070
 	c.Assert(err, checker.IsNil)
5069 5071
 
5070
-	result := buildImage(name, withExternalBuildContext(ctx))
5071
-	result.Assert(c, icmd.Success)
5072
+	result := cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
5072 5073
 
5073 5074
 	c.Assert(result.Combined(), checker.Not(checker.Contains), "Using cache")
5074 5075
 }
... ...
@@ -5340,14 +5344,14 @@ func (s *DockerSuite) TestBuildDockerignoreComment(c *check.C) {
5340 5340
         RUN sh -c "(ls -la /tmp/#1)"
5341 5341
         RUN sh -c "(! ls -la /tmp/#2)"
5342 5342
         RUN sh -c "(! ls /tmp/foo) && (! ls /tmp/foo2) && (ls /tmp/dir1/foo)"`
5343
-	buildImageSuccessfully(c, name, withBuildContext(c,
5344
-		withFile("Dockerfile", dockerfile),
5345
-		withFile("foo", "foo"),
5346
-		withFile("foo2", "foo2"),
5347
-		withFile("dir1/foo", "foo in dir1"),
5348
-		withFile("#1", "# file 1"),
5349
-		withFile("#2", "# file 2"),
5350
-		withFile(".dockerignore", `# Visual C++ cache files
5343
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
5344
+		build.WithFile("Dockerfile", dockerfile),
5345
+		build.WithFile("foo", "foo"),
5346
+		build.WithFile("foo2", "foo2"),
5347
+		build.WithFile("dir1/foo", "foo in dir1"),
5348
+		build.WithFile("#1", "# file 1"),
5349
+		build.WithFile("#2", "# file 2"),
5350
+		build.WithFile(".dockerignore", `# Visual C++ cache files
5351 5351
 # because we have git ;-)
5352 5352
 # The above comment is from #20083
5353 5353
 foo
... ...
@@ -5365,8 +5369,8 @@ func (s *DockerSuite) TestBuildWithUTF8BOM(c *check.C) {
5365 5365
 	name := "test-with-utf8-bom"
5366 5366
 	dockerfile := []byte(`FROM busybox`)
5367 5367
 	bomDockerfile := append([]byte{0xEF, 0xBB, 0xBF}, dockerfile...)
5368
-	buildImageSuccessfully(c, name, withBuildContext(c,
5369
-		withFile("Dockerfile", string(bomDockerfile)),
5368
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
5369
+		build.WithFile("Dockerfile", string(bomDockerfile)),
5370 5370
 	))
5371 5371
 }
5372 5372
 
... ...
@@ -5381,9 +5385,9 @@ func (s *DockerSuite) TestBuildWithUTF8BOMDockerignore(c *check.C) {
5381 5381
 		RUN ls /tmp/.dockerignore`
5382 5382
 	dockerignore := []byte("./Dockerfile\n")
5383 5383
 	bomDockerignore := append([]byte{0xEF, 0xBB, 0xBF}, dockerignore...)
5384
-	buildImageSuccessfully(c, name, withBuildContext(c,
5385
-		withFile("Dockerfile", dockerfile),
5386
-		withFile(".dockerignore", string(bomDockerignore)),
5384
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
5385
+		build.WithFile("Dockerfile", dockerfile),
5386
+		build.WithFile(".dockerignore", string(bomDockerignore)),
5387 5387
 	))
5388 5388
 }
5389 5389
 
... ...
@@ -5571,17 +5575,18 @@ func (s *DockerSuite) TestBuildCacheFromEqualDiffIDsLength(c *check.C) {
5571 5571
 		FROM busybox
5572 5572
 		RUN echo "test"
5573 5573
 		ENTRYPOINT ["sh"]`
5574
-	ctx := fakeContext(c, dockerfile, map[string]string{
5575
-		"Dockerfile": dockerfile,
5576
-	})
5574
+	ctx := fakecontext.New(c, "",
5575
+		fakecontext.WithDockerfile(dockerfile),
5576
+		fakecontext.WithFiles(map[string]string{
5577
+			"Dockerfile": dockerfile,
5578
+		}))
5577 5579
 	defer ctx.Close()
5578 5580
 
5579
-	buildImageSuccessfully(c, "build1", withExternalBuildContext(ctx))
5581
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
5580 5582
 	id1 := getIDByName(c, "build1")
5581 5583
 
5582 5584
 	// rebuild with cache-from
5583
-	result := buildImage("build2", cli.WithFlags("--cache-from=build1"), withExternalBuildContext(ctx))
5584
-	result.Assert(c, icmd.Success)
5585
+	result := cli.BuildCmd(c, "build2", cli.WithFlags("--cache-from=build1"), build.WithExternalBuildContext(ctx))
5585 5586
 	id2 := getIDByName(c, "build2")
5586 5587
 	c.Assert(id1, checker.Equals, id2)
5587 5588
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 2)
... ...
@@ -5594,30 +5599,30 @@ func (s *DockerSuite) TestBuildCacheFrom(c *check.C) {
5594 5594
 		ENV FOO=bar
5595 5595
 		ADD baz /
5596 5596
 		RUN touch bax`
5597
-	ctx := fakeContext(c, dockerfile, map[string]string{
5598
-		"Dockerfile": dockerfile,
5599
-		"baz":        "baz",
5600
-	})
5597
+	ctx := fakecontext.New(c, "",
5598
+		fakecontext.WithDockerfile(dockerfile),
5599
+		fakecontext.WithFiles(map[string]string{
5600
+			"Dockerfile": dockerfile,
5601
+			"baz":        "baz",
5602
+		}))
5601 5603
 	defer ctx.Close()
5602 5604
 
5603
-	buildImageSuccessfully(c, "build1", withExternalBuildContext(ctx))
5605
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
5604 5606
 	id1 := getIDByName(c, "build1")
5605 5607
 
5606 5608
 	// rebuild with cache-from
5607
-	result := buildImage("build2", cli.WithFlags("--cache-from=build1"), withExternalBuildContext(ctx))
5608
-	result.Assert(c, icmd.Success)
5609
+	result := cli.BuildCmd(c, "build2", cli.WithFlags("--cache-from=build1"), build.WithExternalBuildContext(ctx))
5609 5610
 	id2 := getIDByName(c, "build2")
5610 5611
 	c.Assert(id1, checker.Equals, id2)
5611 5612
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 3)
5612
-	dockerCmd(c, "rmi", "build2")
5613
+	cli.DockerCmd(c, "rmi", "build2")
5613 5614
 
5614 5615
 	// no cache match with unknown source
5615
-	result = buildImage("build2", cli.WithFlags("--cache-from=nosuchtag"), withExternalBuildContext(ctx))
5616
-	result.Assert(c, icmd.Success)
5616
+	result = cli.BuildCmd(c, "build2", cli.WithFlags("--cache-from=nosuchtag"), build.WithExternalBuildContext(ctx))
5617 5617
 	id2 = getIDByName(c, "build2")
5618 5618
 	c.Assert(id1, checker.Not(checker.Equals), id2)
5619 5619
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 0)
5620
-	dockerCmd(c, "rmi", "build2")
5620
+	cli.DockerCmd(c, "rmi", "build2")
5621 5621
 
5622 5622
 	// clear parent images
5623 5623
 	tempDir, err := ioutil.TempDir("", "test-build-cache-from-")
... ...
@@ -5626,33 +5631,31 @@ func (s *DockerSuite) TestBuildCacheFrom(c *check.C) {
5626 5626
 	}
5627 5627
 	defer os.RemoveAll(tempDir)
5628 5628
 	tempFile := filepath.Join(tempDir, "img.tar")
5629
-	dockerCmd(c, "save", "-o", tempFile, "build1")
5630
-	dockerCmd(c, "rmi", "build1")
5631
-	dockerCmd(c, "load", "-i", tempFile)
5632
-	parentID, _ := dockerCmd(c, "inspect", "-f", "{{.Parent}}", "build1")
5629
+	cli.DockerCmd(c, "save", "-o", tempFile, "build1")
5630
+	cli.DockerCmd(c, "rmi", "build1")
5631
+	cli.DockerCmd(c, "load", "-i", tempFile)
5632
+	parentID := cli.DockerCmd(c, "inspect", "-f", "{{.Parent}}", "build1").Combined()
5633 5633
 	c.Assert(strings.TrimSpace(parentID), checker.Equals, "")
5634 5634
 
5635 5635
 	// cache still applies without parents
5636
-	result = buildImage("build2", cli.WithFlags("--cache-from=build1"), withExternalBuildContext(ctx))
5637
-	result.Assert(c, icmd.Success)
5636
+	result = cli.BuildCmd(c, "build2", cli.WithFlags("--cache-from=build1"), build.WithExternalBuildContext(ctx))
5638 5637
 	id2 = getIDByName(c, "build2")
5639 5638
 	c.Assert(id1, checker.Equals, id2)
5640 5639
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 3)
5641
-	history1, _ := dockerCmd(c, "history", "-q", "build2")
5640
+	history1 := cli.DockerCmd(c, "history", "-q", "build2").Combined()
5642 5641
 
5643 5642
 	// Retry, no new intermediate images
5644
-	result = buildImage("build3", cli.WithFlags("--cache-from=build1"), withExternalBuildContext(ctx))
5645
-	result.Assert(c, icmd.Success)
5643
+	result = cli.BuildCmd(c, "build3", cli.WithFlags("--cache-from=build1"), build.WithExternalBuildContext(ctx))
5646 5644
 	id3 := getIDByName(c, "build3")
5647 5645
 	c.Assert(id1, checker.Equals, id3)
5648 5646
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 3)
5649
-	history2, _ := dockerCmd(c, "history", "-q", "build3")
5647
+	history2 := cli.DockerCmd(c, "history", "-q", "build3").Combined()
5650 5648
 
5651 5649
 	c.Assert(history1, checker.Equals, history2)
5652
-	dockerCmd(c, "rmi", "build2")
5653
-	dockerCmd(c, "rmi", "build3")
5654
-	dockerCmd(c, "rmi", "build1")
5655
-	dockerCmd(c, "load", "-i", tempFile)
5650
+	cli.DockerCmd(c, "rmi", "build2")
5651
+	cli.DockerCmd(c, "rmi", "build3")
5652
+	cli.DockerCmd(c, "rmi", "build1")
5653
+	cli.DockerCmd(c, "load", "-i", tempFile)
5656 5654
 
5657 5655
 	// Modify file, everything up to last command and layers are reused
5658 5656
 	dockerfile = `
... ...
@@ -5663,14 +5666,13 @@ func (s *DockerSuite) TestBuildCacheFrom(c *check.C) {
5663 5663
 	err = ioutil.WriteFile(filepath.Join(ctx.Dir, "Dockerfile"), []byte(dockerfile), 0644)
5664 5664
 	c.Assert(err, checker.IsNil)
5665 5665
 
5666
-	result = buildImage("build2", cli.WithFlags("--cache-from=build1"), withExternalBuildContext(ctx))
5667
-	result.Assert(c, icmd.Success)
5666
+	result = cli.BuildCmd(c, "build2", cli.WithFlags("--cache-from=build1"), build.WithExternalBuildContext(ctx))
5668 5667
 	id2 = getIDByName(c, "build2")
5669 5668
 	c.Assert(id1, checker.Not(checker.Equals), id2)
5670 5669
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 2)
5671 5670
 
5672
-	layers1Str, _ := dockerCmd(c, "inspect", "-f", "{{json .RootFS.Layers}}", "build1")
5673
-	layers2Str, _ := dockerCmd(c, "inspect", "-f", "{{json .RootFS.Layers}}", "build2")
5671
+	layers1Str := cli.DockerCmd(c, "inspect", "-f", "{{json .RootFS.Layers}}", "build1").Combined()
5672
+	layers2Str := cli.DockerCmd(c, "inspect", "-f", "{{json .RootFS.Layers}}", "build2").Combined()
5674 5673
 
5675 5674
 	var layers1 []string
5676 5675
 	var layers2 []string
... ...
@@ -5691,19 +5693,19 @@ func (s *DockerSuite) TestBuildCacheMultipleFrom(c *check.C) {
5691 5691
 		ADD baz /
5692 5692
 		FROM busybox
5693 5693
     ADD baz /`
5694
-	ctx := fakeContext(c, dockerfile, map[string]string{
5695
-		"Dockerfile": dockerfile,
5696
-		"baz":        "baz",
5697
-	})
5694
+	ctx := fakecontext.New(c, "",
5695
+		fakecontext.WithDockerfile(dockerfile),
5696
+		fakecontext.WithFiles(map[string]string{
5697
+			"Dockerfile": dockerfile,
5698
+			"baz":        "baz",
5699
+		}))
5698 5700
 	defer ctx.Close()
5699 5701
 
5700
-	result := buildImage("build1", withExternalBuildContext(ctx))
5701
-	result.Assert(c, icmd.Success)
5702
+	result := cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
5702 5703
 	// second part of dockerfile was a repeat of first so should be cached
5703 5704
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 1)
5704 5705
 
5705
-	result = buildImage("build2", cli.WithFlags("--cache-from=build1"), withExternalBuildContext(ctx))
5706
-	result.Assert(c, icmd.Success)
5706
+	result = cli.BuildCmd(c, "build2", cli.WithFlags("--cache-from=build1"), build.WithExternalBuildContext(ctx))
5707 5707
 	// now both parts of dockerfile should be cached
5708 5708
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 2)
5709 5709
 }
... ...
@@ -5859,31 +5861,30 @@ func (s *DockerSuite) TestBuildCopyFromPreviousRootFS(c *check.C) {
5859 5859
     COPY --from=0 bar baz
5860 5860
     COPY --from=first bar bay`
5861 5861
 
5862
-	ctx := fakeContext(c, fmt.Sprintf(dockerfile, ""), map[string]string{
5863
-		"Dockerfile": dockerfile,
5864
-		"foo":        "abc",
5865
-		"bar":        "def",
5866
-		"baz/aa":     "ghi",
5867
-		"baz/bb":     "jkl",
5868
-	})
5862
+	ctx := fakecontext.New(c, "",
5863
+		fakecontext.WithDockerfile(fmt.Sprintf(dockerfile, "")),
5864
+		fakecontext.WithFiles(map[string]string{
5865
+			"foo":    "abc",
5866
+			"bar":    "def",
5867
+			"baz/aa": "ghi",
5868
+			"baz/bb": "jkl",
5869
+		}))
5869 5870
 	defer ctx.Close()
5870 5871
 
5871
-	result := buildImage("build1", withExternalBuildContext(ctx))
5872
-	result.Assert(c, icmd.Success)
5872
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
5873 5873
 
5874
-	out, _ := dockerCmd(c, "run", "build1", "cat", "bar")
5874
+	out := cli.DockerCmd(c, "run", "build1", "cat", "bar").Combined()
5875 5875
 	c.Assert(strings.TrimSpace(out), check.Equals, "def")
5876
-	out, _ = dockerCmd(c, "run", "build1", "cat", "sub/aa")
5876
+	out = cli.DockerCmd(c, "run", "build1", "cat", "sub/aa").Combined()
5877 5877
 	c.Assert(strings.TrimSpace(out), check.Equals, "ghi")
5878
-	out, _ = dockerCmd(c, "run", "build1", "cat", "sub/cc")
5878
+	out = cli.DockerCmd(c, "run", "build1", "cat", "sub/cc").Combined()
5879 5879
 	c.Assert(strings.TrimSpace(out), check.Equals, "mno")
5880
-	out, _ = dockerCmd(c, "run", "build1", "cat", "baz")
5880
+	out = cli.DockerCmd(c, "run", "build1", "cat", "baz").Combined()
5881 5881
 	c.Assert(strings.TrimSpace(out), check.Equals, "abc")
5882
-	out, _ = dockerCmd(c, "run", "build1", "cat", "bay")
5882
+	out = cli.DockerCmd(c, "run", "build1", "cat", "bay").Combined()
5883 5883
 	c.Assert(strings.TrimSpace(out), check.Equals, "abc")
5884 5884
 
5885
-	result = buildImage("build2", withExternalBuildContext(ctx))
5886
-	result.Assert(c, icmd.Success)
5885
+	result := cli.BuildCmd(c, "build2", build.WithExternalBuildContext(ctx))
5887 5886
 
5888 5887
 	// all commands should be cached
5889 5888
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 7)
... ...
@@ -5892,8 +5893,7 @@ func (s *DockerSuite) TestBuildCopyFromPreviousRootFS(c *check.C) {
5892 5892
 	c.Assert(err, checker.IsNil)
5893 5893
 
5894 5894
 	// changing file in parent block should not affect last block
5895
-	result = buildImage("build3", withExternalBuildContext(ctx))
5896
-	result.Assert(c, icmd.Success)
5895
+	result = cli.BuildCmd(c, "build3", build.WithExternalBuildContext(ctx))
5897 5896
 
5898 5897
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 5)
5899 5898
 
... ...
@@ -5903,108 +5903,92 @@ func (s *DockerSuite) TestBuildCopyFromPreviousRootFS(c *check.C) {
5903 5903
 	c.Assert(err, checker.IsNil)
5904 5904
 
5905 5905
 	// changing file in parent block should affect both first and last block
5906
-	result = buildImage("build4", withExternalBuildContext(ctx))
5907
-	result.Assert(c, icmd.Success)
5906
+	result = cli.BuildCmd(c, "build4", build.WithExternalBuildContext(ctx))
5908 5907
 	c.Assert(strings.Count(result.Combined(), "Using cache"), checker.Equals, 5)
5909 5908
 
5910
-	out, _ = dockerCmd(c, "run", "build4", "cat", "bay")
5909
+	out = cli.DockerCmd(c, "run", "build4", "cat", "bay").Combined()
5911 5910
 	c.Assert(strings.TrimSpace(out), check.Equals, "pqr")
5912
-	out, _ = dockerCmd(c, "run", "build4", "cat", "baz")
5911
+	out = cli.DockerCmd(c, "run", "build4", "cat", "baz").Combined()
5913 5912
 	c.Assert(strings.TrimSpace(out), check.Equals, "pqr")
5914 5913
 }
5915 5914
 
5916 5915
 func (s *DockerSuite) TestBuildCopyFromPreviousRootFSErrors(c *check.C) {
5917
-	dockerfile := `
5916
+	testCases := []struct {
5917
+		dockerfile    string
5918
+		expectedError string
5919
+	}{
5920
+		{
5921
+			dockerfile: `
5918 5922
 		FROM busybox
5919
-		COPY --from=foo foo bar`
5920
-
5921
-	ctx := fakeContext(c, dockerfile, map[string]string{
5922
-		"Dockerfile": dockerfile,
5923
-		"foo":        "abc",
5924
-	})
5925
-	defer ctx.Close()
5926
-
5927
-	buildImage("build1", withExternalBuildContext(ctx)).Assert(c, icmd.Expected{
5928
-		ExitCode: 1,
5929
-		Err:      "invalid from flag value foo",
5930
-	})
5931
-
5932
-	dockerfile = `
5923
+		COPY --from=foo foo bar`,
5924
+			expectedError: "invalid from flag value foo",
5925
+		},
5926
+		{
5927
+			dockerfile: `
5933 5928
 		FROM busybox
5934
-		COPY --from=0 foo bar`
5935
-
5936
-	ctx = fakeContext(c, dockerfile, map[string]string{
5937
-		"Dockerfile": dockerfile,
5938
-		"foo":        "abc",
5939
-	})
5940
-	defer ctx.Close()
5941
-
5942
-	buildImage("build1", withExternalBuildContext(ctx)).Assert(c, icmd.Expected{
5943
-		ExitCode: 1,
5944
-		Err:      "invalid from flag value 0 refers current build block",
5945
-	})
5946
-
5947
-	dockerfile = `
5929
+		COPY --from=0 foo bar`,
5930
+			expectedError: "invalid from flag value 0 refers current build block",
5931
+		},
5932
+		{
5933
+			dockerfile: `
5948 5934
 		FROM busybox AS foo
5949
-		COPY --from=bar foo bar`
5950
-
5951
-	ctx = fakeContext(c, dockerfile, map[string]string{
5952
-		"Dockerfile": dockerfile,
5953
-		"foo":        "abc",
5954
-	})
5955
-	defer ctx.Close()
5956
-
5957
-	buildImage("build1", withExternalBuildContext(ctx)).Assert(c, icmd.Expected{
5958
-		ExitCode: 1,
5959
-		Err:      "invalid from flag value bar",
5960
-	})
5961
-
5962
-	dockerfile = `
5935
+		COPY --from=bar foo bar`,
5936
+			expectedError: "invalid from flag value bar",
5937
+		},
5938
+		{
5939
+			dockerfile: `
5963 5940
 		FROM busybox AS 1
5964
-		COPY --from=1 foo bar`
5941
+		COPY --from=1 foo bar`,
5942
+			expectedError: "invalid name for build stage",
5943
+		},
5944
+	}
5965 5945
 
5966
-	ctx = fakeContext(c, dockerfile, map[string]string{
5967
-		"Dockerfile": dockerfile,
5968
-		"foo":        "abc",
5969
-	})
5970
-	defer ctx.Close()
5946
+	for _, tc := range testCases {
5947
+		ctx := fakecontext.New(c, "",
5948
+			fakecontext.WithDockerfile(tc.dockerfile),
5949
+			fakecontext.WithFiles(map[string]string{
5950
+				"foo": "abc",
5951
+			}))
5971 5952
 
5972
-	buildImage("build1", withExternalBuildContext(ctx)).Assert(c, icmd.Expected{
5973
-		ExitCode: 1,
5974
-		Err:      "invalid name for build stage",
5975
-	})
5953
+		cli.Docker(cli.Build("build1"), build.WithExternalBuildContext(ctx)).Assert(c, icmd.Expected{
5954
+			ExitCode: 1,
5955
+			Err:      tc.expectedError,
5956
+		})
5957
+
5958
+		ctx.Close()
5959
+	}
5976 5960
 }
5977 5961
 
5978 5962
 func (s *DockerSuite) TestBuildCopyFromPreviousFrom(c *check.C) {
5979 5963
 	dockerfile := `
5980 5964
 		FROM busybox
5981 5965
 		COPY foo bar`
5982
-	ctx := fakeContext(c, dockerfile, map[string]string{
5983
-		"Dockerfile": dockerfile,
5984
-		"foo":        "abc",
5985
-	})
5966
+	ctx := fakecontext.New(c, "",
5967
+		fakecontext.WithDockerfile(dockerfile),
5968
+		fakecontext.WithFiles(map[string]string{
5969
+			"foo": "abc",
5970
+		}))
5986 5971
 	defer ctx.Close()
5987 5972
 
5988
-	result := buildImage("build1", withExternalBuildContext(ctx))
5989
-	result.Assert(c, icmd.Success)
5973
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
5990 5974
 
5991 5975
 	dockerfile = `
5992 5976
 		FROM build1:latest AS foo
5993 5977
     FROM busybox
5994 5978
 		COPY --from=foo bar /
5995 5979
 		COPY foo /`
5996
-	ctx = fakeContext(c, dockerfile, map[string]string{
5997
-		"Dockerfile": dockerfile,
5998
-		"foo":        "def",
5999
-	})
5980
+	ctx = fakecontext.New(c, "",
5981
+		fakecontext.WithDockerfile(dockerfile),
5982
+		fakecontext.WithFiles(map[string]string{
5983
+			"foo": "def",
5984
+		}))
6000 5985
 	defer ctx.Close()
6001 5986
 
6002
-	result = buildImage("build2", withExternalBuildContext(ctx))
6003
-	result.Assert(c, icmd.Success)
5987
+	cli.BuildCmd(c, "build2", build.WithExternalBuildContext(ctx))
6004 5988
 
6005
-	out, _ := dockerCmd(c, "run", "build2", "cat", "bar")
5989
+	out := cli.DockerCmd(c, "run", "build2", "cat", "bar").Combined()
6006 5990
 	c.Assert(strings.TrimSpace(out), check.Equals, "abc")
6007
-	out, _ = dockerCmd(c, "run", "build2", "cat", "foo")
5991
+	out = cli.DockerCmd(c, "run", "build2", "cat", "foo").Combined()
6008 5992
 	c.Assert(strings.TrimSpace(out), check.Equals, "def")
6009 5993
 }
6010 5994
 
... ...
@@ -6020,18 +6004,17 @@ func (s *DockerSuite) TestBuildCopyFromImplicitFrom(c *check.C) {
6020 6020
 			COPY --from=busybox License.txt foo`
6021 6021
 	}
6022 6022
 
6023
-	ctx := fakeContext(c, dockerfile, map[string]string{
6024
-		"Dockerfile": dockerfile,
6025
-	})
6023
+	ctx := fakecontext.New(c, "",
6024
+		fakecontext.WithDockerfile(dockerfile),
6025
+	)
6026 6026
 	defer ctx.Close()
6027 6027
 
6028
-	result := buildImage("build1", withExternalBuildContext(ctx))
6029
-	result.Assert(c, icmd.Success)
6028
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
6030 6029
 
6031 6030
 	if DaemonIsWindows() {
6032
-		out, _ := dockerCmd(c, "run", "build1", "cat", "License.txt")
6031
+		out := cli.DockerCmd(c, "run", "build1", "cat", "License.txt").Combined()
6033 6032
 		c.Assert(len(out), checker.GreaterThan, 10)
6034
-		out2, _ := dockerCmd(c, "run", "build1", "cat", "foo")
6033
+		out2 := cli.DockerCmd(c, "run", "build1", "cat", "foo").Combined()
6035 6034
 		c.Assert(out, check.Equals, out2)
6036 6035
 	}
6037 6036
 }
... ...
@@ -6042,31 +6025,28 @@ func (s *DockerRegistrySuite) TestBuildCopyFromImplicitPullingFrom(c *check.C) {
6042 6042
 	dockerfile := `
6043 6043
 		FROM busybox
6044 6044
 		COPY foo bar`
6045
-	ctx := fakeContext(c, dockerfile, map[string]string{
6046
-		"Dockerfile": dockerfile,
6047
-		"foo":        "abc",
6048
-	})
6045
+	ctx := fakecontext.New(c, "",
6046
+		fakecontext.WithDockerfile(dockerfile),
6047
+		fakecontext.WithFiles(map[string]string{
6048
+			"foo": "abc",
6049
+		}))
6049 6050
 	defer ctx.Close()
6050 6051
 
6051
-	result := buildImage(repoName, withExternalBuildContext(ctx))
6052
-	result.Assert(c, icmd.Success)
6052
+	cli.BuildCmd(c, repoName, build.WithExternalBuildContext(ctx))
6053 6053
 
6054
-	dockerCmd(c, "push", repoName)
6055
-	dockerCmd(c, "rmi", repoName)
6054
+	cli.DockerCmd(c, "push", repoName)
6055
+	cli.DockerCmd(c, "rmi", repoName)
6056 6056
 
6057 6057
 	dockerfile = `
6058 6058
 		FROM busybox
6059 6059
 		COPY --from=%s bar baz`
6060 6060
 
6061
-	ctx = fakeContext(c, fmt.Sprintf(dockerfile, repoName), map[string]string{
6062
-		"Dockerfile": dockerfile,
6063
-	})
6061
+	ctx = fakecontext.New(c, "", fakecontext.WithDockerfile(fmt.Sprintf(dockerfile, repoName)))
6064 6062
 	defer ctx.Close()
6065 6063
 
6066
-	result = buildImage("build1", withExternalBuildContext(ctx))
6067
-	result.Assert(c, icmd.Success)
6064
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
6068 6065
 
6069
-	dockerCmdWithResult("run", "build1", "cat", "baz").Assert(c, icmd.Expected{Out: "abc"})
6066
+	cli.Docker(cli.Args("run", "build1", "cat", "baz")).Assert(c, icmd.Expected{Out: "abc"})
6070 6067
 }
6071 6068
 
6072 6069
 func (s *DockerSuite) TestBuildFromPreviousBlock(c *check.C) {
... ...
@@ -6081,20 +6061,17 @@ func (s *DockerSuite) TestBuildFromPreviousBlock(c *check.C) {
6081 6081
 		COPY --from=foo1 foo f1
6082 6082
 		COPY --from=FOo2 foo f2
6083 6083
 		` // foo2 case also tests that names are canse insensitive
6084
-	ctx := fakeContext(c, dockerfile, map[string]string{
6085
-		"Dockerfile": dockerfile,
6086
-		"foo":        "bar",
6087
-	})
6084
+	ctx := fakecontext.New(c, "",
6085
+		fakecontext.WithDockerfile(dockerfile),
6086
+		fakecontext.WithFiles(map[string]string{
6087
+			"foo": "bar",
6088
+		}))
6088 6089
 	defer ctx.Close()
6089 6090
 
6090
-	result := buildImage("build1", withExternalBuildContext(ctx))
6091
-	result.Assert(c, icmd.Success)
6092
-
6093
-	dockerCmdWithResult("run", "build1", "cat", "foo").Assert(c, icmd.Expected{Out: "bar"})
6094
-
6095
-	dockerCmdWithResult("run", "build1", "cat", "f1").Assert(c, icmd.Expected{Out: "bar1"})
6096
-
6097
-	dockerCmdWithResult("run", "build1", "cat", "f2").Assert(c, icmd.Expected{Out: "bar2"})
6091
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
6092
+	cli.Docker(cli.Args("run", "build1", "cat", "foo")).Assert(c, icmd.Expected{Out: "bar"})
6093
+	cli.Docker(cli.Args("run", "build1", "cat", "f1")).Assert(c, icmd.Expected{Out: "bar1"})
6094
+	cli.Docker(cli.Args("run", "build1", "cat", "f2")).Assert(c, icmd.Expected{Out: "bar2"})
6098 6095
 }
6099 6096
 
6100 6097
 func (s *DockerTrustSuite) TestCopyFromTrustedBuild(c *check.C) {
... ...
@@ -6124,32 +6101,32 @@ func (s *DockerSuite) TestBuildCopyFromPreviousFromWindows(c *check.C) {
6124 6124
 	dockerfile := `
6125 6125
 		FROM ` + testEnv.MinimalBaseImage() + `
6126 6126
 		COPY foo c:\\bar`
6127
-	ctx := fakeContext(c, dockerfile, map[string]string{
6128
-		"Dockerfile": dockerfile,
6129
-		"foo":        "abc",
6130
-	})
6127
+	ctx := fakecontext.New(c, "",
6128
+		fakecontext.WithDockerfile(dockerfile),
6129
+		fakecontext.WithFiles(map[string]string{
6130
+			"foo": "abc",
6131
+		}))
6131 6132
 	defer ctx.Close()
6132 6133
 
6133
-	result := buildImage("build1", withExternalBuildContext(ctx))
6134
-	result.Assert(c, icmd.Success)
6134
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx))
6135 6135
 
6136 6136
 	dockerfile = `
6137 6137
 		FROM build1:latest
6138 6138
     	FROM ` + testEnv.MinimalBaseImage() + `
6139 6139
 		COPY --from=0 c:\\bar /
6140 6140
 		COPY foo /`
6141
-	ctx = fakeContext(c, dockerfile, map[string]string{
6142
-		"Dockerfile": dockerfile,
6143
-		"foo":        "def",
6144
-	})
6141
+	ctx = fakecontext.New(c, "",
6142
+		fakecontext.WithDockerfile(dockerfile),
6143
+		fakecontext.WithFiles(map[string]string{
6144
+			"foo": "def",
6145
+		}))
6145 6146
 	defer ctx.Close()
6146 6147
 
6147
-	result = buildImage("build2", withExternalBuildContext(ctx))
6148
-	result.Assert(c, icmd.Success)
6148
+	cli.BuildCmd(c, "build2", build.WithExternalBuildContext(ctx))
6149 6149
 
6150
-	out, _ := dockerCmd(c, "run", "build2", "cmd.exe", "/s", "/c", "type", "c:\\bar")
6150
+	out := cli.DockerCmd(c, "run", "build2", "cmd.exe", "/s", "/c", "type", "c:\\bar").Combined()
6151 6151
 	c.Assert(strings.TrimSpace(out), check.Equals, "abc")
6152
-	out, _ = dockerCmd(c, "run", "build2", "cmd.exe", "/s", "/c", "type", "c:\\foo")
6152
+	out = cli.DockerCmd(c, "run", "build2", "cmd.exe", "/s", "/c", "type", "c:\\foo").Combined()
6153 6153
 	c.Assert(strings.TrimSpace(out), check.Equals, "def")
6154 6154
 }
6155 6155
 
... ...
@@ -6197,17 +6174,13 @@ func (s *DockerSuite) TestBuildCopyFromWindowsIsCaseInsensitive(c *check.C) {
6197 6197
 		COPY --from=0 c:\\fOo c:\\copied
6198 6198
 		RUN type c:\\copied
6199 6199
 		`
6200
-	ctx := fakeContext(c, dockerfile, map[string]string{
6201
-		"Dockerfile": dockerfile,
6202
-		"foo":        "hello world",
6203
-	})
6204
-	defer ctx.Close()
6205
-	exp := icmd.Expected{
6200
+	cli.Docker(cli.Build("copyfrom-windows-insensitive"), build.WithBuildContext(c,
6201
+		build.WithFile("Dockerfile", dockerfile),
6202
+		build.WithFile("foo", "hello world"),
6203
+	)).Assert(c, icmd.Expected{
6206 6204
 		ExitCode: 0,
6207 6205
 		Out:      "hello world",
6208
-	}
6209
-	result := buildImage("copyfrom-windows-insensitive", withExternalBuildContext(ctx))
6210
-	result.Assert(c, exp)
6206
+	})
6211 6207
 }
6212 6208
 
6213 6209
 func (s *DockerSuite) TestBuildIntermediateTarget(c *check.C) {
... ...
@@ -6217,19 +6190,17 @@ func (s *DockerSuite) TestBuildIntermediateTarget(c *check.C) {
6217 6217
 		FROM busybox
6218 6218
 		CMD ["/dist"]
6219 6219
 		`
6220
-	ctx := fakeContext(c, dockerfile, map[string]string{
6221
-		"Dockerfile": dockerfile,
6222
-	})
6220
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(dockerfile))
6223 6221
 	defer ctx.Close()
6224 6222
 
6225
-	result := buildImage("build1", withExternalBuildContext(ctx),
6223
+	cli.BuildCmd(c, "build1", build.WithExternalBuildContext(ctx),
6226 6224
 		cli.WithFlags("--target", "build-env"))
6227
-	result.Assert(c, icmd.Success)
6228 6225
 
6229
-	res := inspectFieldJSON(c, "build1", "Config.Cmd")
6230
-	c.Assert(res, checker.Equals, `["/dev"]`)
6226
+	//res := inspectFieldJSON(c, "build1", "Config.Cmd")
6227
+	res := cli.InspectCmd(c, "build1", cli.Format("json .Config.Cmd")).Combined()
6228
+	c.Assert(strings.TrimSpace(res), checker.Equals, `["/dev"]`)
6231 6229
 
6232
-	result = buildImage("build1", withExternalBuildContext(ctx),
6230
+	result := cli.Docker(cli.Build("build1"), build.WithExternalBuildContext(ctx),
6233 6231
 		cli.WithFlags("--target", "nosuchtarget"))
6234 6232
 	result.Assert(c, icmd.Expected{
6235 6233
 		ExitCode: 1,
... ...
@@ -6274,13 +6245,13 @@ func (s *DockerSuite) TestBuildWindowsUser(c *check.C) {
6274 6274
 // Note 27545 was reverted in 28505, but a new fix was added subsequently in 28514.
6275 6275
 func (s *DockerSuite) TestBuildCopyFileDotWithWorkdir(c *check.C) {
6276 6276
 	name := "testbuildcopyfiledotwithworkdir"
6277
-	buildImageSuccessfully(c, name, withBuildContext(c,
6278
-		withFile("Dockerfile", `FROM busybox
6277
+	buildImageSuccessfully(c, name, build.WithBuildContext(c,
6278
+		build.WithFile("Dockerfile", `FROM busybox
6279 6279
 WORKDIR /foo
6280 6280
 COPY file .
6281 6281
 RUN ["cat", "/foo/file"]
6282 6282
 `),
6283
-		withFile("file", "content"),
6283
+		build.WithFile("file", "content"),
6284 6284
 	))
6285 6285
 }
6286 6286
 
... ...
@@ -16,6 +16,8 @@ import (
16 16
 
17 17
 	"github.com/docker/docker/integration-cli/checker"
18 18
 	"github.com/docker/docker/integration-cli/cli"
19
+	"github.com/docker/docker/integration-cli/cli/build"
20
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
19 21
 	"github.com/docker/docker/pkg/testutil"
20 22
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
21 23
 	"github.com/docker/go-units"
... ...
@@ -26,10 +28,10 @@ func (s *DockerSuite) TestBuildResourceConstraintsAreUsed(c *check.C) {
26 26
 	testRequires(c, cpuCfsQuota)
27 27
 	name := "testbuildresourceconstraints"
28 28
 
29
-	ctx := fakeContext(c, `
29
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile(`
30 30
 	FROM hello-world:frozen
31 31
 	RUN ["/hello"]
32
-	`, map[string]string{})
32
+	`))
33 33
 	cli.Docker(
34 34
 		cli.Args("build", "--no-cache", "--rm=false", "--memory=64m", "--memory-swap=-1", "--cpuset-cpus=0", "--cpuset-mems=0", "--cpu-shares=100", "--cpu-quota=8000", "--ulimit", "nofile=42", "-t", name, "."),
35 35
 		cli.InDir(ctx.Dir),
... ...
@@ -85,7 +87,7 @@ func (s *DockerSuite) TestBuildAddChangeOwnership(c *check.C) {
85 85
 	testRequires(c, DaemonIsLinux)
86 86
 	name := "testbuildaddown"
87 87
 
88
-	ctx := func() *FakeContext {
88
+	ctx := func() *fakecontext.Fake {
89 89
 		dockerfile := `
90 90
 			FROM busybox
91 91
 			ADD foo /bar/
... ...
@@ -108,12 +110,12 @@ func (s *DockerSuite) TestBuildAddChangeOwnership(c *check.C) {
108 108
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
109 109
 			c.Fatalf("failed to open destination dockerfile: %v", err)
110 110
 		}
111
-		return fakeContextFromDir(tmpDir)
111
+		return fakecontext.New(c, tmpDir)
112 112
 	}()
113 113
 
114 114
 	defer ctx.Close()
115 115
 
116
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
116
+	buildImageSuccessfully(c, name, build.WithExternalBuildContext(ctx))
117 117
 }
118 118
 
119 119
 // Test that an infinite sleep during a build is killed if the client disconnects.
... ...
@@ -134,7 +136,7 @@ func (s *DockerSuite) TestBuildCancellationKillsSleep(c *check.C) {
134 134
 	defer observer.Stop()
135 135
 
136 136
 	// (Note: one year, will never finish)
137
-	ctx := fakeContext(c, "FROM busybox\nRUN sleep 31536000", nil)
137
+	ctx := fakecontext.New(c, "", fakecontext.WithDockerfile("FROM busybox\nRUN sleep 31536000"))
138 138
 	defer ctx.Close()
139 139
 
140 140
 	buildCmd := exec.Command(dockerBinary, "build", "-t", name, ".")
... ...
@@ -10,7 +10,9 @@ import (
10 10
 	"time"
11 11
 
12 12
 	"github.com/docker/docker/integration-cli/checker"
13
+	"github.com/docker/docker/integration-cli/cli"
13 14
 	"github.com/docker/docker/integration-cli/cli/build"
15
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
14 16
 	"github.com/docker/docker/pkg/stringid"
15 17
 	"github.com/docker/docker/pkg/testutil"
16 18
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
... ...
@@ -438,19 +440,21 @@ RUN chmod 755 /entrypoint.sh
438 438
 ENTRYPOINT ["/entrypoint.sh"]
439 439
 CMD echo foobar`
440 440
 
441
-	ctx := fakeContext(c, dockerfile, map[string]string{
442
-		"entrypoint.sh": `#!/bin/sh
441
+	ctx := fakecontext.New(c, "",
442
+		fakecontext.WithDockerfile(dockerfile),
443
+		fakecontext.WithFiles(map[string]string{
444
+			"entrypoint.sh": `#!/bin/sh
443 445
 echo "I am an entrypoint"
444 446
 exec "$@"`,
445
-	})
447
+		}))
446 448
 	defer ctx.Close()
447 449
 
448
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
450
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
449 451
 
450
-	out, _ := dockerCmd(c, "create", "--entrypoint=", name, "echo", "foo")
452
+	out := cli.DockerCmd(c, "create", "--entrypoint=", name, "echo", "foo").Combined()
451 453
 	id := strings.TrimSpace(out)
452 454
 	c.Assert(id, check.Not(check.Equals), "")
453
-	out, _ = dockerCmd(c, "start", "-a", id)
455
+	out = cli.DockerCmd(c, "start", "-a", id).Combined()
454 456
 	c.Assert(strings.TrimSpace(out), check.Equals, "foo")
455 457
 }
456 458
 
... ...
@@ -24,6 +24,7 @@ import (
24 24
 	"github.com/docker/docker/integration-cli/checker"
25 25
 	"github.com/docker/docker/integration-cli/cli"
26 26
 	"github.com/docker/docker/integration-cli/cli/build"
27
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
27 28
 	"github.com/docker/docker/pkg/mount"
28 29
 	"github.com/docker/docker/pkg/stringid"
29 30
 	"github.com/docker/docker/pkg/stringutils"
... ...
@@ -4174,22 +4175,25 @@ RUN chmod 755 /entrypoint.sh
4174 4174
 ENTRYPOINT ["/entrypoint.sh"]
4175 4175
 CMD echo foobar`
4176 4176
 
4177
-	ctx := fakeContext(c, dockerfile, map[string]string{
4178
-		"entrypoint.sh": `#!/bin/sh
4177
+	ctx := fakecontext.New(c, "",
4178
+		fakecontext.WithDockerfile(dockerfile),
4179
+		fakecontext.WithFiles(map[string]string{
4180
+			"entrypoint.sh": `#!/bin/sh
4179 4181
 echo "I am an entrypoint"
4180 4182
 exec "$@"`,
4181
-	})
4183
+		}))
4182 4184
 	defer ctx.Close()
4183 4185
 
4184
-	buildImageSuccessfully(c, name, withExternalBuildContext(ctx))
4186
+	cli.BuildCmd(c, name, build.WithExternalBuildContext(ctx))
4185 4187
 
4186
-	out, _ := dockerCmd(c, "run", "--entrypoint=", "-t", name, "echo", "foo")
4188
+	out := cli.DockerCmd(c, "run", "--entrypoint=", "-t", name, "echo", "foo").Combined()
4187 4189
 	c.Assert(strings.TrimSpace(out), check.Equals, "foo")
4188 4190
 
4189 4191
 	// CMD will be reset as well (the same as setting a custom entrypoint)
4190
-	_, _, err := dockerCmdWithError("run", "--entrypoint=", "-t", name)
4191
-	c.Assert(err, check.NotNil)
4192
-	c.Assert(err.Error(), checker.Contains, "No command specified")
4192
+	cli.Docker(cli.Args("run", "--entrypoint=", "-t", name)).Assert(c, icmd.Expected{
4193
+		ExitCode: 125,
4194
+		Err:      "No command specified",
4195
+	})
4193 4196
 }
4194 4197
 
4195 4198
 func (s *DockerDaemonSuite) TestRunWithUlimitAndDaemonDefault(c *check.C) {
... ...
@@ -1,16 +1,13 @@
1 1
 package main
2 2
 
3 3
 import (
4
-	"bytes"
5 4
 	"encoding/json"
6 5
 	"errors"
7 6
 	"fmt"
8 7
 	"io"
9 8
 	"io/ioutil"
10
-	"net"
11 9
 	"net/http"
12 10
 	"net/http/httptest"
13
-	"net/url"
14 11
 	"os"
15 12
 	"os/exec"
16 13
 	"path"
... ...
@@ -22,11 +19,11 @@ import (
22 22
 	"github.com/docker/docker/api/types"
23 23
 	"github.com/docker/docker/integration-cli/checker"
24 24
 	"github.com/docker/docker/integration-cli/cli"
25
-	"github.com/docker/docker/integration-cli/cli/build"
25
+	"github.com/docker/docker/integration-cli/cli/build/fakecontext"
26
+	"github.com/docker/docker/integration-cli/cli/build/fakestorage"
26 27
 	"github.com/docker/docker/integration-cli/daemon"
27 28
 	"github.com/docker/docker/integration-cli/registry"
28 29
 	"github.com/docker/docker/integration-cli/request"
29
-	"github.com/docker/docker/pkg/stringutils"
30 30
 	icmd "github.com/docker/docker/pkg/testutil/cmd"
31 31
 	"github.com/go-check/check"
32 32
 )
... ...
@@ -124,212 +121,6 @@ func getContainerCount(c *check.C) int {
124 124
 	return 0
125 125
 }
126 126
 
127
-// FakeContext creates directories that can be used as a build context
128
-type FakeContext struct {
129
-	Dir string
130
-}
131
-
132
-// Add a file at a path, creating directories where necessary
133
-func (f *FakeContext) Add(file, content string) error {
134
-	return f.addFile(file, []byte(content))
135
-}
136
-
137
-func (f *FakeContext) addFile(file string, content []byte) error {
138
-	fp := filepath.Join(f.Dir, filepath.FromSlash(file))
139
-	dirpath := filepath.Dir(fp)
140
-	if dirpath != "." {
141
-		if err := os.MkdirAll(dirpath, 0755); err != nil {
142
-			return err
143
-		}
144
-	}
145
-	return ioutil.WriteFile(fp, content, 0644)
146
-
147
-}
148
-
149
-// Delete a file at a path
150
-func (f *FakeContext) Delete(file string) error {
151
-	fp := filepath.Join(f.Dir, filepath.FromSlash(file))
152
-	return os.RemoveAll(fp)
153
-}
154
-
155
-// Close deletes the context
156
-func (f *FakeContext) Close() error {
157
-	return os.RemoveAll(f.Dir)
158
-}
159
-
160
-func fakeContextFromNewTempDir(c *check.C) *FakeContext {
161
-	tmp, err := ioutil.TempDir("", "fake-context")
162
-	c.Assert(err, checker.IsNil)
163
-	if err := os.Chmod(tmp, 0755); err != nil {
164
-		c.Fatal(err)
165
-	}
166
-	return fakeContextFromDir(tmp)
167
-}
168
-
169
-func fakeContextFromDir(dir string) *FakeContext {
170
-	return &FakeContext{dir}
171
-}
172
-
173
-func fakeContextWithFiles(c *check.C, files map[string]string) *FakeContext {
174
-	ctx := fakeContextFromNewTempDir(c)
175
-	for file, content := range files {
176
-		if err := ctx.Add(file, content); err != nil {
177
-			ctx.Close()
178
-			c.Fatal(err)
179
-		}
180
-	}
181
-	return ctx
182
-}
183
-
184
-func fakeContextAddDockerfile(c *check.C, ctx *FakeContext, dockerfile string) {
185
-	if err := ctx.Add("Dockerfile", dockerfile); err != nil {
186
-		ctx.Close()
187
-		c.Fatal(err)
188
-	}
189
-}
190
-
191
-func fakeContext(c *check.C, dockerfile string, files map[string]string) *FakeContext {
192
-	ctx := fakeContextWithFiles(c, files)
193
-	fakeContextAddDockerfile(c, ctx, dockerfile)
194
-	return ctx
195
-}
196
-
197
-// FakeStorage is a static file server. It might be running locally or remotely
198
-// on test host.
199
-type FakeStorage interface {
200
-	Close() error
201
-	URL() string
202
-	CtxDir() string
203
-}
204
-
205
-func fakeBinaryStorage(c *check.C, archives map[string]*bytes.Buffer) FakeStorage {
206
-	ctx := fakeContextFromNewTempDir(c)
207
-	for name, content := range archives {
208
-		if err := ctx.addFile(name, content.Bytes()); err != nil {
209
-			c.Fatal(err)
210
-		}
211
-	}
212
-	return fakeStorageWithContext(c, ctx)
213
-}
214
-
215
-// fakeStorage returns either a local or remote (at daemon machine) file server
216
-func fakeStorage(c *check.C, files map[string]string) FakeStorage {
217
-	ctx := fakeContextWithFiles(c, files)
218
-	return fakeStorageWithContext(c, ctx)
219
-}
220
-
221
-// fakeStorageWithContext returns either a local or remote (at daemon machine) file server
222
-func fakeStorageWithContext(c *check.C, ctx *FakeContext) FakeStorage {
223
-	if testEnv.LocalDaemon() {
224
-		return newLocalFakeStorage(c, ctx)
225
-	}
226
-	return newRemoteFileServer(c, ctx)
227
-}
228
-
229
-// localFileStorage is a file storage on the running machine
230
-type localFileStorage struct {
231
-	*FakeContext
232
-	*httptest.Server
233
-}
234
-
235
-func (s *localFileStorage) URL() string {
236
-	return s.Server.URL
237
-}
238
-
239
-func (s *localFileStorage) CtxDir() string {
240
-	return s.FakeContext.Dir
241
-}
242
-
243
-func (s *localFileStorage) Close() error {
244
-	defer s.Server.Close()
245
-	return s.FakeContext.Close()
246
-}
247
-
248
-func newLocalFakeStorage(c *check.C, ctx *FakeContext) *localFileStorage {
249
-	handler := http.FileServer(http.Dir(ctx.Dir))
250
-	server := httptest.NewServer(handler)
251
-	return &localFileStorage{
252
-		FakeContext: ctx,
253
-		Server:      server,
254
-	}
255
-}
256
-
257
-// remoteFileServer is a containerized static file server started on the remote
258
-// testing machine to be used in URL-accepting docker build functionality.
259
-type remoteFileServer struct {
260
-	host      string // hostname/port web server is listening to on docker host e.g. 0.0.0.0:43712
261
-	container string
262
-	image     string
263
-	ctx       *FakeContext
264
-}
265
-
266
-func (f *remoteFileServer) URL() string {
267
-	u := url.URL{
268
-		Scheme: "http",
269
-		Host:   f.host}
270
-	return u.String()
271
-}
272
-
273
-func (f *remoteFileServer) CtxDir() string {
274
-	return f.ctx.Dir
275
-}
276
-
277
-func (f *remoteFileServer) Close() error {
278
-	defer func() {
279
-		if f.ctx != nil {
280
-			f.ctx.Close()
281
-		}
282
-		if f.image != "" {
283
-			deleteImages(f.image)
284
-		}
285
-	}()
286
-	if f.container == "" {
287
-		return nil
288
-	}
289
-	return deleteContainer(f.container)
290
-}
291
-
292
-func newRemoteFileServer(c *check.C, ctx *FakeContext) *remoteFileServer {
293
-	var (
294
-		image     = fmt.Sprintf("fileserver-img-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10)))
295
-		container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10)))
296
-	)
297
-
298
-	ensureHTTPServerImage(c)
299
-
300
-	// Build the image
301
-	fakeContextAddDockerfile(c, ctx, `FROM httpserver
302
-COPY . /static`)
303
-	buildImageSuccessfully(c, image, build.WithoutCache, withExternalBuildContext(ctx))
304
-
305
-	// Start the container
306
-	dockerCmd(c, "run", "-d", "-P", "--name", container, image)
307
-
308
-	// Find out the system assigned port
309
-	out, _ := dockerCmd(c, "port", container, "80/tcp")
310
-	fileserverHostPort := strings.Trim(out, "\n")
311
-	_, port, err := net.SplitHostPort(fileserverHostPort)
312
-	if err != nil {
313
-		c.Fatalf("unable to parse file server host:port: %v", err)
314
-	}
315
-
316
-	dockerHostURL, err := url.Parse(daemonHost())
317
-	if err != nil {
318
-		c.Fatalf("unable to parse daemon host URL: %v", err)
319
-	}
320
-
321
-	host, _, err := net.SplitHostPort(dockerHostURL.Host)
322
-	if err != nil {
323
-		c.Fatalf("unable to parse docker daemon host:port: %v", err)
324
-	}
325
-
326
-	return &remoteFileServer{
327
-		container: container,
328
-		image:     image,
329
-		host:      fmt.Sprintf("%s:%s", host, port),
330
-		ctx:       ctx}
331
-}
332
-
333 127
 func inspectFieldAndUnmarshall(c *check.C, name, field string, output interface{}) {
334 128
 	str := inspectFieldJSON(c, name, field)
335 129
 	err := json.Unmarshal([]byte(str), output)
... ...
@@ -452,42 +243,7 @@ func buildImage(name string, cmdOperators ...cli.CmdOperator) *icmd.Result {
452 452
 	return cli.Docker(cli.Build(name), cmdOperators...)
453 453
 }
454 454
 
455
-func withExternalBuildContext(ctx *FakeContext) func(*icmd.Cmd) func() {
456
-	return func(cmd *icmd.Cmd) func() {
457
-		cmd.Dir = ctx.Dir
458
-		cmd.Command = append(cmd.Command, ".")
459
-		return nil
460
-	}
461
-}
462
-
463
-func withBuildContext(c *check.C, contextOperators ...func(*FakeContext) error) func(*icmd.Cmd) func() {
464
-	ctx := fakeContextFromNewTempDir(c)
465
-	for _, op := range contextOperators {
466
-		if err := op(ctx); err != nil {
467
-			c.Fatal(err)
468
-		}
469
-	}
470
-	return func(cmd *icmd.Cmd) func() {
471
-		cmd.Dir = ctx.Dir
472
-		cmd.Command = append(cmd.Command, ".")
473
-		return closeBuildContext(c, ctx)
474
-	}
475
-}
476
-
477
-func withFile(name, content string) func(*FakeContext) error {
478
-	return func(ctx *FakeContext) error {
479
-		return ctx.Add(name, content)
480
-	}
481
-}
482
-
483
-func closeBuildContext(c *check.C, ctx *FakeContext) func() {
484
-	return func() {
485
-		if err := ctx.Close(); err != nil {
486
-			c.Fatal(err)
487
-		}
488
-	}
489
-}
490
-
455
+// Deprecated: use trustedcmd
491 456
 func trustedBuild(cmd *icmd.Cmd) func() {
492 457
 	trustedCmd(cmd)
493 458
 	return nil
... ...
@@ -523,7 +279,7 @@ func (g *fakeGit) Close() {
523 523
 }
524 524
 
525 525
 func newFakeGit(c *check.C, name string, files map[string]string, enforceLocalServer bool) *fakeGit {
526
-	ctx := fakeContextWithFiles(c, files)
526
+	ctx := fakecontext.New(c, "", fakecontext.WithFiles(files))
527 527
 	defer ctx.Close()
528 528
 	curdir, err := os.Getwd()
529 529
 	if err != nil {
... ...
@@ -578,7 +334,7 @@ func newFakeGit(c *check.C, name string, files map[string]string, enforceLocalSe
578 578
 	var server gitServer
579 579
 	if !enforceLocalServer {
580 580
 		// use fakeStorage server, which might be local or remote (at test daemon)
581
-		server = fakeStorageWithContext(c, fakeContextFromDir(root))
581
+		server = fakestorage.New(c, root)
582 582
 	} else {
583 583
 		// always start a local http server on CLI test machine
584 584
 		httpServer := httptest.NewServer(http.FileServer(http.Dir(root)))
585 585
deleted file mode 100644
... ...
@@ -1,67 +0,0 @@
1
-package main
2
-
3
-import (
4
-	"io/ioutil"
5
-	"os"
6
-	"os/exec"
7
-	"path/filepath"
8
-	"sync"
9
-)
10
-
11
-var ensureHTTPServerOnce sync.Once
12
-
13
-func ensureHTTPServerImage(t testingT) {
14
-	var doIt bool
15
-	ensureHTTPServerOnce.Do(func() {
16
-		doIt = true
17
-	})
18
-
19
-	if !doIt {
20
-		return
21
-	}
22
-
23
-	defer testEnv.ProtectImage(t, "httpserver:latest")
24
-
25
-	tmp, err := ioutil.TempDir("", "docker-http-server-test")
26
-	if err != nil {
27
-		t.Fatalf("could not build http server: %v", err)
28
-	}
29
-	defer os.RemoveAll(tmp)
30
-
31
-	goos := testEnv.DaemonPlatform()
32
-	if goos == "" {
33
-		goos = "linux"
34
-	}
35
-	goarch := os.Getenv("DOCKER_ENGINE_GOARCH")
36
-	if goarch == "" {
37
-		goarch = "amd64"
38
-	}
39
-
40
-	goCmd, lookErr := exec.LookPath("go")
41
-	if lookErr != nil {
42
-		t.Fatalf("could not build http server: %v", lookErr)
43
-	}
44
-
45
-	cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "httpserver"), "github.com/docker/docker/contrib/httpserver")
46
-	cmd.Env = append(os.Environ(), []string{
47
-		"CGO_ENABLED=0",
48
-		"GOOS=" + goos,
49
-		"GOARCH=" + goarch,
50
-	}...)
51
-	var out []byte
52
-	if out, err = cmd.CombinedOutput(); err != nil {
53
-		t.Fatalf("could not build http server: %s", string(out))
54
-	}
55
-
56
-	cpCmd, lookErr := exec.LookPath("cp")
57
-	if lookErr != nil {
58
-		t.Fatalf("could not build http server: %v", lookErr)
59
-	}
60
-	if out, err = exec.Command(cpCmd, "../contrib/httpserver/Dockerfile", filepath.Join(tmp, "Dockerfile")).CombinedOutput(); err != nil {
61
-		t.Fatalf("could not build http server: %v", string(out))
62
-	}
63
-
64
-	if out, err = exec.Command(dockerBinary, "build", "-q", "-t", "httpserver", tmp).CombinedOutput(); err != nil {
65
-		t.Fatalf("could not build http server: %v", string(out))
66
-	}
67
-}
... ...
@@ -190,12 +190,6 @@ func (t *testNotary) Close() {
190 190
 	os.RemoveAll(t.dir)
191 191
 }
192 192
 
193
-// Deprecated: used trustedCmd instead
194
-func trustedExecCmd(cmd *exec.Cmd) {
195
-	pwd := "12345678"
196
-	cmd.Env = append(cmd.Env, trustEnv(notaryURL, pwd, pwd)...)
197
-}
198
-
199 193
 func trustedCmd(cmd *icmd.Cmd) {
200 194
 	pwd := "12345678"
201 195
 	cmd.Env = append(cmd.Env, trustEnv(notaryURL, pwd, pwd)...)