builder: Make builtin arg pruning work with > 1 arg
The previous implementation would error out with "Unexpected EOF" which was caused by an underlying "array index out-of-bounds" error. The root cause was deleting items from the same array that was being iterated over. The iteration was unaware that the array size had changed, resulting in an error. The new implementation builds a new array instead of mutating a copy of the old one. Fixes: #32744 Signed-off-by: Dave Tucker <dt@docker.com>
This commit is contained in:
parent
9986762bc7
commit
8c532a6822
2 changed files with 12 additions and 9 deletions
|
@ -449,12 +449,11 @@ func run(b *Builder, args []string, attributes map[string]bool, original string)
|
|||
// these args are transparent so resulting image should be the same regardless of the value
|
||||
if len(cmdBuildEnv) > 0 {
|
||||
saveCmd = config.Cmd
|
||||
tmpBuildEnv := make([]string, len(cmdBuildEnv))
|
||||
copy(tmpBuildEnv, cmdBuildEnv)
|
||||
for i, env := range tmpBuildEnv {
|
||||
var tmpBuildEnv []string
|
||||
for _, env := range cmdBuildEnv {
|
||||
key := strings.SplitN(env, "=", 2)[0]
|
||||
if b.buildArgs.IsUnreferencedBuiltin(key) {
|
||||
tmpBuildEnv = append(tmpBuildEnv[:i], tmpBuildEnv[i+1:]...)
|
||||
if !b.buildArgs.IsUnreferencedBuiltin(key) {
|
||||
tmpBuildEnv = append(tmpBuildEnv, env)
|
||||
}
|
||||
}
|
||||
sort.Strings(tmpBuildEnv)
|
||||
|
|
|
@ -4345,7 +4345,8 @@ func (s *DockerSuite) TestBuildTimeArgHistoryExclusions(c *check.C) {
|
|||
ARG %s
|
||||
RUN echo "Testing Build Args!"`, envKey, explicitProxyKey)
|
||||
buildImage(imgName,
|
||||
cli.WithFlags("--build-arg", fmt.Sprintf("%s=%s", envKey, envVal),
|
||||
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),
|
||||
|
@ -4355,6 +4356,9 @@ func (s *DockerSuite) TestBuildTimeArgHistoryExclusions(c *check.C) {
|
|||
if strings.Contains(out, proxy) {
|
||||
c.Fatalf("failed to exclude proxy settings from history!")
|
||||
}
|
||||
if strings.Contains(out, "https_proxy") {
|
||||
c.Fatalf("failed to exclude proxy settings from history!")
|
||||
}
|
||||
if !strings.Contains(out, fmt.Sprintf("%s=%s", envKey, envVal)) {
|
||||
c.Fatalf("explicitly defined ARG %s is not in output", explicitProxyKey)
|
||||
}
|
||||
|
@ -6156,7 +6160,7 @@ func (s *DockerSuite) TestBuildCopyFromPreviousFromWindows(c *check.C) {
|
|||
func (s *DockerSuite) TestBuildCopyFromForbidWindowsSystemPaths(c *check.C) {
|
||||
testRequires(c, DaemonIsWindows)
|
||||
dockerfile := `
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
COPY --from=0 %s c:\\oscopy
|
||||
`
|
||||
|
@ -6173,7 +6177,7 @@ func (s *DockerSuite) TestBuildCopyFromForbidWindowsSystemPaths(c *check.C) {
|
|||
func (s *DockerSuite) TestBuildCopyFromForbidWindowsRelativePaths(c *check.C) {
|
||||
testRequires(c, DaemonIsWindows)
|
||||
dockerfile := `
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
COPY --from=0 %s c:\\oscopy
|
||||
`
|
||||
|
@ -6192,7 +6196,7 @@ func (s *DockerSuite) TestBuildCopyFromWindowsIsCaseInsensitive(c *check.C) {
|
|||
testRequires(c, DaemonIsWindows)
|
||||
dockerfile := `
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
COPY foo /
|
||||
COPY foo /
|
||||
FROM ` + testEnv.MinimalBaseImage() + `
|
||||
COPY --from=0 c:\\fOo c:\\copied
|
||||
RUN type c:\\copied
|
||||
|
|
Loading…
Add table
Reference in a new issue