{"record":{"id":"635f125535dd465e","repo":"docker/cli","slug":"invalid-field-s","errorCode":null,"errorMessage":"invalid field %s","messagePattern":"invalid field (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"opts/network.go","lineNumber":62,"sourceCode":"\tlongSyntax, err := regexp.MatchString(`\\w+=\\w+(,\\w+=\\w+)*`, value)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar netOpt NetworkAttachmentOpts\n\tif longSyntax {\n\t\tcsvReader := csv.NewReader(strings.NewReader(value))\n\t\tfields, err := csvReader.Read()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnetOpt.Aliases = []string{}\n\t\tfor _, field := range fields {\n\t\t\t// TODO(thaJeztah): these options should not be case-insensitive.\n\t\t\tkey, val, ok := strings.Cut(strings.ToLower(field), \"=\")\n\t\t\tif !ok || key == \"\" {\n\t\t\t\treturn fmt.Errorf(\"invalid field %s\", field)\n\t\t\t}\n\n\t\t\tkey = strings.TrimSpace(key)\n\t\t\tval = strings.TrimSpace(val)\n\n\t\t\tswitch key {\n\t\t\tcase networkOptName:\n\t\t\t\tnetOpt.Target = val\n\t\t\tcase networkOptAlias:\n\t\t\t\tnetOpt.Aliases = append(netOpt.Aliases, val)\n\t\t\tcase networkOptIPv4Address:\n\t\t\t\tnetOpt.IPv4Address, err = netip.ParseAddr(val)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\tcase networkOptIPv6Address:\n\t\t\t\tnetOpt.IPv6Address, err = netip.ParseAddr(val)\n\t\t\t\tif err != nil {","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/opts/network.go#L44-L80","documentation":"Returned by NetworkOpt.Set (opts/network.go:62) when a long-syntax `--network` CSV field cannot be split into key=value. The parser only enters long-syntax mode when the regex detects at least one `word=word` segment; each field is then split on '=' and lowercased. This fires when a field lacks '=' or has an empty key after lowercasing (before trim).","triggerScenarios":"A `--network` value like `name=mynet,badfield` (the regex matched because another field had =, but this field is bare), `=value` (empty key), or `,=,` style junk. Long syntax is triggered by the presence of any word=word pattern.","commonSituations":"Mixing long and short syntax fragments, trailing comma producing an empty field, or a stray value without a key.","solutions":["Ensure every field is key=value, e.g. name=mynet,alias=web.","Remove trailing/empty comma segments that produce empty fields.","If you only want the short form (network name), avoid including any key=value so the regex routes to the short-syntax branch."],"exampleFix":"// before\n--network \"name=mynet,badfield,alias=web\"\n\n// after\n--network \"name=mynet,alias=web\"","handlingStrategy":"validation","validationCode":"func validateNetworkLongSyntax(val string) error {\n    if !regexp.MustCompile(`\\w+=\\w+(,\\w+=\\w+)*`).MatchString(val) {\n        return nil // short syntax, not checked here\n    }\n    r := csv.NewReader(strings.NewReader(val))\n    fields, err := r.Read()\n    if err != nil {\n        return err\n    }\n    for _, f := range fields {\n        k, _, ok := strings.Cut(strings.ToLower(f), \"=\")\n        if !ok || k == \"\" {\n            return fmt.Errorf(\"invalid field %q (expected key=value)\", f)\n        }\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"var n opts.NetworkOpt\nif err := n.Set(spec); err != nil {\n    return fmt.Errorf(\"network %q: %w\", spec, err)\n}","preventionTips":["Use either fully short (name only) or fully long (key=value) syntax; don't mix.","Strip trailing commas that create empty fields.","Build network specs from a typed struct."],"tags":["network","docker","csv","validation","configuration"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}