{"record":{"id":"461b2f87ca7dfbba","repo":"docker/cli","slug":"invalid-type-t-for-string-list","errorCode":null,"errorMessage":"invalid type %T for string list","messagePattern":"invalid type %T for string list","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/compose/loader/loader.go","lineNumber":800,"sourceCode":"}\n\nvar transformStringOrNumberList TransformerFunc = func(value any) (any, error) {\n\tlist := value.([]any)\n\tresult := make([]string, len(list))\n\tfor i, item := range list {\n\t\tresult[i] = fmt.Sprint(item)\n\t}\n\treturn result, nil\n}\n\nvar transformStringList TransformerFunc = func(data any) (any, error) {\n\tswitch value := data.(type) {\n\tcase string:\n\t\treturn []string{value}, nil\n\tcase []any:\n\t\treturn value, nil\n\tdefault:\n\t\treturn data, fmt.Errorf(\"invalid type %T for string list\", value)\n\t}\n}\n\nvar transformHostsList TransformerFunc = func(data any) (any, error) {\n\thl := transformListOrMapping(data, \":\", false, []string{\"=\", \":\"})\n\n\t// Remove brackets from IP addresses if present (for example \"[::1]\" -> \"::1\").\n\tresult := make([]string, 0, len(hl))\n\tfor _, hip := range hl {\n\t\thost, ip, _ := strings.Cut(hip, \":\")\n\t\tif len(ip) > 2 && ip[0] == '[' && ip[len(ip)-1] == ']' {\n\t\t\tip = ip[1 : len(ip)-1]\n\t\t}\n\t\tresult = append(result, fmt.Sprintf(\"%s:%s\", host, ip))\n\t}\n\treturn result, nil\n}\n","sourceCodeStart":782,"sourceCodeEnd":818,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/cli/compose/loader/loader.go#L782-L818","documentation":"Thrown by transformStringList, the transformer for string-list fields (e.g. `cap_add`, `dns`, `tmpfs` short form). It accepts a single string or a `[]any`; any other type (map, int, bool) is rejected.","triggerScenarios":"A string-list field is given a mapping or scalar non-string, e.g. `cap_add: { add: ALL }` or `dns: 8.8.8.8` (int-ish).","commonSituations":"Using a map where a list is required; forgetting the list bracket for a single value.","solutions":["Use a list: `cap_add: [ALL]`.","A single string is also accepted: `cap_add: ALL`."],"exampleFix":"# before\nweb:\n  dns:\n    server: 8.8.8.8\n# after\nweb:\n  dns:\n    - 8.8.8.8","handlingStrategy":"type-guard","validationCode":"func validateStringList(field string, v any) error {\n    switch v.(type) {\n    case string, []any:\n        return nil\n    default:\n        return fmt.Errorf(\"%s must be string or list, got %T\", field, v)\n    }\n}","typeGuard":"func isStringOrList(v any) bool {\n    switch v.(type) {\n    case string, []any:\n        return true\n    }\n    return false\n}","tryCatchPattern":null,"preventionTips":["String-list fields accept a single string or a list of strings — not a map.","When in doubt, use the list form.","Validate rendered output."],"tags":["compose","type-mismatch","list","service"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}