diff --git a/pkg/dockerfile/parse.go b/pkg/dockerfile/parse.go index 11d946d5a..31b68f9ba 100644 --- a/pkg/dockerfile/parse.go +++ b/pkg/dockerfile/parse.go @@ -453,6 +453,9 @@ func (d *Dockerfile) indexStagesByTarget() { } func parseUser(instruction *parser.Node) instructions.KeyValuePair { + if instruction.Next == nil { + return instructions.KeyValuePair{} + } value := instruction.Next.Value if strings.Contains(value, ":") && !strings.HasPrefix(value, "${") { value = strings.Split(value, ":")[0] @@ -462,6 +465,9 @@ func parseUser(instruction *parser.Node) instructions.KeyValuePair { func parseArg(instruction *parser.Node) instructions.KeyValuePairOptional { node := instruction.Next + if node == nil { + return instructions.KeyValuePairOptional{} + } if node.Next != nil { value := node.Next.Value return instructions.KeyValuePairOptional{Key: node.Value, Value: &value} diff --git a/pkg/dockerfile/parse_test.go b/pkg/dockerfile/parse_test.go index 6441321ff..931f861f5 100644 --- a/pkg/dockerfile/parse_test.go +++ b/pkg/dockerfile/parse_test.go @@ -358,3 +358,17 @@ FROM ${REGISTRY}/${IMAGE}:${TAG}` ) s.Equal("gcr.io/my/image:latest", baseImage) } + +func (s *ParseTestSuite) TestValuelessUserDoesNotPanic() { + d, err := Parse("FROM ubuntu\nUSER") + s.NoError(err) + s.Require().NotEmpty(d.Stages) + s.Empty(d.Stages[0].Users[0].Key) +} + +func (s *ParseTestSuite) TestValuelessArgDoesNotPanic() { + d, err := Parse("FROM ubuntu\nARG") + s.NoError(err) + s.Require().NotEmpty(d.Stages) + s.Empty(d.Stages[0].Args[0].Key) +}