summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Nephin <dnephin@docker.com>2017-04-28 12:49:50 -0400
committerDaniel Nephin <dnephin@docker.com>2017-05-01 18:20:32 -0400
commita4e352ccb0f938510a6eaf72df3fb7ef67e41e75 (patch)
tree6b02a0bc7501e406f925537f21623c72b2bef521
parent8c532a682272b65b208b6eeff1581b9553e556ca (diff)
downloaddocker-a4e352ccb0f938510a6eaf72df3fb7ef67e41e75.tar.gz
Fix cache miss when builtin build args are used.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
-rw-r--r--builder/dockerfile/dispatchers.go33
-rw-r--r--integration-cli/docker_cli_build_test.go26
2 files changed, 33 insertions, 26 deletions
diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go
index 4c165aff13..ad6aff67b5 100644
--- a/builder/dockerfile/dispatchers.go
+++ b/builder/dockerfile/dispatchers.go
@@ -408,9 +408,7 @@ func run(b *Builder, args []string, attributes map[string]bool, original string)
// that starts with "foo=abc" to be considered part of a build-time env var.
saveCmd := config.Cmd
if len(cmdBuildEnv) > 0 {
- sort.Strings(cmdBuildEnv)
- tmpEnv := append([]string{fmt.Sprintf("|%d", len(cmdBuildEnv))}, cmdBuildEnv...)
- saveCmd = strslice.StrSlice(append(tmpEnv, saveCmd...))
+ saveCmd = prependEnvOnCmd(b.buildArgs, cmdBuildEnv, saveCmd)
}
b.runConfig.Cmd = saveCmd
@@ -445,25 +443,24 @@ func run(b *Builder, args []string, attributes map[string]bool, original string)
// properly match it.
b.runConfig.Env = env
- // remove builtinAllowedBuildArgs (see: builder.go) from the saveCmd
- // these args are transparent so resulting image should be the same regardless of the value
- if len(cmdBuildEnv) > 0 {
- saveCmd = config.Cmd
- var tmpBuildEnv []string
- for _, env := range cmdBuildEnv {
- key := strings.SplitN(env, "=", 2)[0]
- if !b.buildArgs.IsUnreferencedBuiltin(key) {
- tmpBuildEnv = append(tmpBuildEnv, env)
- }
- }
- sort.Strings(tmpBuildEnv)
- tmpEnv := append([]string{fmt.Sprintf("|%d", len(tmpBuildEnv))}, tmpBuildEnv...)
- saveCmd = strslice.StrSlice(append(tmpEnv, saveCmd...))
- }
b.runConfig.Cmd = saveCmd
return b.commit(cID, cmd, "run")
}
+func prependEnvOnCmd(buildArgs *buildArgs, buildArgVars []string, cmd strslice.StrSlice) strslice.StrSlice {
+ var tmpBuildEnv []string
+ for _, env := range buildArgVars {
+ key := strings.SplitN(env, "=", 2)[0]
+ if !buildArgs.IsUnreferencedBuiltin(key) {
+ tmpBuildEnv = append(tmpBuildEnv, env)
+ }
+ }
+
+ sort.Strings(tmpBuildEnv)
+ tmpEnv := append([]string{fmt.Sprintf("|%d", len(tmpBuildEnv))}, tmpBuildEnv...)
+ return strslice.StrSlice(append(tmpEnv, cmd...))
+}
+
// CMD foo
//
// Set the default command to run in the container (which may be empty).
diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go
index 19b108856e..b046330d64 100644
--- a/integration-cli/docker_cli_build_test.go
+++ b/integration-cli/docker_cli_build_test.go
@@ -4344,15 +4344,22 @@ func (s *DockerSuite) TestBuildTimeArgHistoryExclusions(c *check.C) {
ARG %s
ARG %s
RUN echo "Testing Build Args!"`, envKey, explicitProxyKey)
- buildImage(imgName,
- cli.WithFlags("--build-arg", "https_proxy=https://proxy.example.com",
- "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal),
- "--build-arg", fmt.Sprintf("%s=%s", explicitProxyKey, explicitProxyVal),
- "--build-arg", proxy),
- build.WithDockerfile(dockerfile),
- ).Assert(c, icmd.Success)
- out, _ := dockerCmd(c, "history", "--no-trunc", imgName)
+ buildImage := func(imgName string) string {
+ cli.BuildCmd(c, imgName,
+ cli.WithFlags("--build-arg", "https_proxy=https://proxy.example.com",
+ "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal),
+ "--build-arg", fmt.Sprintf("%s=%s", explicitProxyKey, explicitProxyVal),
+ "--build-arg", proxy),
+ build.WithDockerfile(dockerfile),
+ )
+ return getIDByName(c, imgName)
+ }
+
+ origID := buildImage(imgName)
+ result := cli.DockerCmd(c, "history", "--no-trunc", imgName)
+ out := result.Stdout()
+
if strings.Contains(out, proxy) {
c.Fatalf("failed to exclude proxy settings from history!")
}
@@ -4365,6 +4372,9 @@ func (s *DockerSuite) TestBuildTimeArgHistoryExclusions(c *check.C) {
if !strings.Contains(out, fmt.Sprintf("%s=%s", envKey, envVal)) {
c.Fatalf("missing build arguments from output")
}
+
+ cacheID := buildImage(imgName + "-two")
+ c.Assert(origID, checker.Equals, cacheID)
}
func (s *DockerSuite) TestBuildBuildTimeArgCacheHit(c *check.C) {