code: func arg(b *Builder, args []string, attributes map[string]bool, flagArgs []string, original string) error {
  	if len(args) != 1 {
  		return fmt.Errorf("ARG requires exactly one argument definition")
  	}
  
  	var (
  		name       string
  		value      string
  		hasDefault bool
  	)
  
  	arg := args[0]
  	// 'arg' can just be a name or name-value pair. Note that this is different
  	// from 'env' that handles the split of name and value at the parser level.
  	// The reason for doing it differently for 'arg' is that we support just
  	// defining an arg and not assign it a value (while 'env' always expects a
  	// name-value pair). If possible, it will be good to harmonize the two.
  	if strings.Contains(arg, "=") {
  		parts := strings.SplitN(arg, "=", 2)
  		name = parts[0]
  		value = parts[1]
  		hasDefault = true
  	} else {
  		name = arg
  		hasDefault = false
  	}
  	// add the arg to allowed list of build-time args from this step on.
  	b.AllowedArgs[name] = true
  
  	// If there is a default value associated with this arg then add it to the
  	// b.buildArgs if one is not already passed to the builder. The args passed
  	// to builder override the default value of 'arg'.
  	if _, ok := b.Args[name]; !ok && hasDefault {
  		b.Args[name] = value
  	}
  
  	return nil
  }
docs: // ARG name[=value]
  //
  // Adds the variable foo to the trusted list of variables that can be passed
  // to builder using the --build-arg flag for expansion/subsitution or passing to 'run'.
  // Dockerfile author may optionally set a default value of this variable.