diff --git a/builder/parser/line_parsers.go b/builder/parser/line_parsers.go index 9bea21a958..b28693666c 100644 --- a/builder/parser/line_parsers.go +++ b/builder/parser/line_parsers.go @@ -232,6 +232,11 @@ func parseString(rest string) (*Node, map[string]bool, error) { // parseJSON converts JSON arrays to an AST. func parseJSON(rest string) (*Node, map[string]bool, error) { + rest = strings.TrimLeftFunc(rest, unicode.IsSpace) + if !strings.HasPrefix(rest, "[") { + return nil, nil, fmt.Errorf(`Error parsing "%s" as a JSON array`, rest) + } + var myJSON []interface{} if err := json.NewDecoder(strings.NewReader(rest)).Decode(&myJSON); err != nil { return nil, nil, err diff --git a/builder/parser/testfiles/ADD-COPY-with-JSON/Dockerfile b/builder/parser/testfiles/ADD-COPY-with-JSON/Dockerfile index 49372b0607..00b444cba5 100644 --- a/builder/parser/testfiles/ADD-COPY-with-JSON/Dockerfile +++ b/builder/parser/testfiles/ADD-COPY-with-JSON/Dockerfile @@ -3,6 +3,8 @@ MAINTAINER Seongyeol Lim COPY . /go/src/github.com/docker/docker ADD . / +ADD null / +COPY nullfile /tmp ADD [ "vimrc", "/tmp" ] COPY [ "bashrc", "/tmp" ] COPY [ "test file", "/tmp" ] diff --git a/builder/parser/testfiles/ADD-COPY-with-JSON/result b/builder/parser/testfiles/ADD-COPY-with-JSON/result index 86c3fef726..85aee64018 100644 --- a/builder/parser/testfiles/ADD-COPY-with-JSON/result +++ b/builder/parser/testfiles/ADD-COPY-with-JSON/result @@ -2,6 +2,8 @@ (maintainer "Seongyeol Lim ") (copy "." "/go/src/github.com/docker/docker") (add "." "/") +(add "null" "/") +(copy "nullfile" "/tmp") (add "vimrc" "/tmp") (copy "bashrc" "/tmp") (copy "test file" "/tmp") diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index dad833ac42..bf7de304c5 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -5444,3 +5444,26 @@ func (s *DockerTrustSuite) TestBuildContextDirIsSymlink(c *check.C) { c.Fatalf("build failed with exit status %d: %s", exitStatus, out) } } + +// Issue #15634: COPY fails when path starts with "null" +func (s *DockerSuite) TestBuildNullStringInAddCopyVolume(c *check.C) { + name := "testbuildnullstringinaddcopyvolume" + + ctx, err := fakeContext(` + FROM busybox + + ADD null / + COPY nullfile / + VOLUME nullvolume + `, + map[string]string{ + "null": "test1", + "nullfile": "test2", + }, + ) + defer ctx.Close() + c.Assert(err, check.IsNil) + + _, err = buildImageFromContext(name, ctx, true) + c.Assert(err, check.IsNil) +}