diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index b7c2faab6a..f624e815cd 100644 --- a/builder/dockerfile/dispatchers.go +++ b/builder/dockerfile/dispatchers.go @@ -395,9 +395,7 @@ func run(req dispatchRequest) error { // 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(req.builder.buildArgs, cmdBuildEnv, saveCmd) } req.runConfig.Cmd = saveCmd @@ -434,25 +432,24 @@ func run(req dispatchRequest) error { // properly match it. req.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 !req.builder.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...)) - } req.runConfig.Cmd = saveCmd return req.builder.commitContainer(cID, copyRunConfig(req.runConfig, withCmd(cmd))) } +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 ed6633682b..aaeb499155 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -4354,15 +4354,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!") } @@ -4375,6 +4382,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) {