Introduce a typed command system and 2 phase parse/dispatch build
This is a work base to introduce more features like build time dockerfile optimisations, dependency analysis and parallel build, as well as a first step to go from a dispatch-inline process to a frontend+backend process. Signed-off-by: Simon Ferquel <simon.ferquel@docker.com> Upstream-commit: 669c0677980b04bcbf871bb7c2d9f07caccfd42b Component: engine
This commit is contained in:
@@ -438,6 +438,82 @@ func (s *DockerSuite) TestBuildChownOnCopy(c *check.C) {
|
||||
assert.Contains(c, string(out), "Successfully built")
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestBuildCopyCacheOnFileChange(c *check.C) {
|
||||
|
||||
dockerfile := `FROM busybox
|
||||
COPY file /file`
|
||||
|
||||
ctx1 := fakecontext.New(c, "",
|
||||
fakecontext.WithDockerfile(dockerfile),
|
||||
fakecontext.WithFile("file", "foo"))
|
||||
ctx2 := fakecontext.New(c, "",
|
||||
fakecontext.WithDockerfile(dockerfile),
|
||||
fakecontext.WithFile("file", "bar"))
|
||||
|
||||
var build = func(ctx *fakecontext.Fake) string {
|
||||
res, body, err := request.Post("/build",
|
||||
request.RawContent(ctx.AsTarReader(c)),
|
||||
request.ContentType("application/x-tar"))
|
||||
|
||||
require.NoError(c, err)
|
||||
assert.Equal(c, http.StatusOK, res.StatusCode)
|
||||
|
||||
out, err := request.ReadBody(body)
|
||||
|
||||
ids := getImageIDsFromBuild(c, out)
|
||||
return ids[len(ids)-1]
|
||||
}
|
||||
|
||||
id1 := build(ctx1)
|
||||
id2 := build(ctx1)
|
||||
id3 := build(ctx2)
|
||||
|
||||
if id1 != id2 {
|
||||
c.Fatal("didn't use the cache")
|
||||
}
|
||||
if id1 == id3 {
|
||||
c.Fatal("COPY With different source file should not share same cache")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestBuildAddCacheOnFileChange(c *check.C) {
|
||||
|
||||
dockerfile := `FROM busybox
|
||||
ADD file /file`
|
||||
|
||||
ctx1 := fakecontext.New(c, "",
|
||||
fakecontext.WithDockerfile(dockerfile),
|
||||
fakecontext.WithFile("file", "foo"))
|
||||
ctx2 := fakecontext.New(c, "",
|
||||
fakecontext.WithDockerfile(dockerfile),
|
||||
fakecontext.WithFile("file", "bar"))
|
||||
|
||||
var build = func(ctx *fakecontext.Fake) string {
|
||||
res, body, err := request.Post("/build",
|
||||
request.RawContent(ctx.AsTarReader(c)),
|
||||
request.ContentType("application/x-tar"))
|
||||
|
||||
require.NoError(c, err)
|
||||
assert.Equal(c, http.StatusOK, res.StatusCode)
|
||||
|
||||
out, err := request.ReadBody(body)
|
||||
|
||||
ids := getImageIDsFromBuild(c, out)
|
||||
return ids[len(ids)-1]
|
||||
}
|
||||
|
||||
id1 := build(ctx1)
|
||||
id2 := build(ctx1)
|
||||
id3 := build(ctx2)
|
||||
|
||||
if id1 != id2 {
|
||||
c.Fatal("didn't use the cache")
|
||||
}
|
||||
if id1 == id3 {
|
||||
c.Fatal("COPY With different source file should not share same cache")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestBuildWithSession(c *check.C) {
|
||||
testRequires(c, ExperimentalDaemon)
|
||||
|
||||
|
||||
@@ -1173,12 +1173,13 @@ func (s *DockerSuite) TestBuildForceRm(c *check.C) {
|
||||
containerCountBefore := getContainerCount(c)
|
||||
name := "testbuildforcerm"
|
||||
|
||||
buildImage(name, cli.WithFlags("--force-rm"), build.WithBuildContext(c,
|
||||
build.WithFile("Dockerfile", `FROM `+minimalBaseImage()+`
|
||||
r := buildImage(name, cli.WithFlags("--force-rm"), build.WithBuildContext(c,
|
||||
build.WithFile("Dockerfile", `FROM busybox
|
||||
RUN true
|
||||
RUN thiswillfail`))).Assert(c, icmd.Expected{
|
||||
ExitCode: 1,
|
||||
})
|
||||
RUN thiswillfail`)))
|
||||
if r.ExitCode != 1 && r.ExitCode != 127 { // different on Linux / Windows
|
||||
c.Fatalf("Wrong exit code")
|
||||
}
|
||||
|
||||
containerCountAfter := getContainerCount(c)
|
||||
if containerCountBefore != containerCountAfter {
|
||||
@@ -4542,7 +4543,6 @@ func (s *DockerSuite) TestBuildBuildTimeArgOverrideEnvDefinedBeforeArg(c *check.
|
||||
}
|
||||
|
||||
func (s *DockerSuite) TestBuildBuildTimeArgExpansion(c *check.C) {
|
||||
testRequires(c, DaemonIsLinux) // Windows does not support ARG
|
||||
imgName := "bldvarstest"
|
||||
|
||||
wdVar := "WDIR"
|
||||
@@ -4559,6 +4559,10 @@ func (s *DockerSuite) TestBuildBuildTimeArgExpansion(c *check.C) {
|
||||
userVal := "testUser"
|
||||
volVar := "VOL"
|
||||
volVal := "/testVol/"
|
||||
if DaemonIsWindows() {
|
||||
volVal = "C:\\testVol"
|
||||
wdVal = "C:\\tmp"
|
||||
}
|
||||
|
||||
buildImageSuccessfully(c, imgName,
|
||||
cli.WithFlags(
|
||||
@@ -4594,7 +4598,7 @@ func (s *DockerSuite) TestBuildBuildTimeArgExpansion(c *check.C) {
|
||||
)
|
||||
|
||||
res := inspectField(c, imgName, "Config.WorkingDir")
|
||||
c.Check(res, check.Equals, filepath.ToSlash(wdVal))
|
||||
c.Check(filepath.ToSlash(res), check.Equals, filepath.ToSlash(wdVal))
|
||||
|
||||
var resArr []string
|
||||
inspectFieldAndUnmarshall(c, imgName, "Config.Env", &resArr)
|
||||
|
||||
Reference in New Issue
Block a user