{"record":{"id":"534683abc2458df8","repo":"docker/cli","slug":"invalid-type-t-for-secret","errorCode":null,"errorMessage":"invalid type %T for secret","messagePattern":"invalid type %T for secret","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/compose/loader/loader.go","lineNumber":747,"sourceCode":"\t\t\t\tports = append(ports, value)\n\t\t\tdefault:\n\t\t\t\treturn data, fmt.Errorf(\"invalid type %T for port\", value)\n\t\t\t}\n\t\t}\n\t\treturn ports, nil\n\tdefault:\n\t\treturn data, fmt.Errorf(\"invalid type %T for port\", entries)\n\t}\n}\n\nvar transformStringSourceMap TransformerFunc = func(data any) (any, error) {\n\tswitch value := data.(type) {\n\tcase string:\n\t\treturn map[string]any{\"source\": value}, nil\n\tcase map[string]any:\n\t\treturn data, nil\n\tdefault:\n\t\treturn data, fmt.Errorf(\"invalid type %T for secret\", value)\n\t}\n}\n\nvar transformBuildConfig TransformerFunc = func(data any) (any, error) {\n\tswitch value := data.(type) {\n\tcase string:\n\t\treturn map[string]any{\"context\": value}, nil\n\tcase map[string]any:\n\t\treturn data, nil\n\tdefault:\n\t\treturn data, fmt.Errorf(\"invalid type %T for service build\", value)\n\t}\n}\n\nvar transformServiceVolumeConfig TransformerFunc = func(data any) (any, error) {\n\tswitch value := data.(type) {\n\tcase string:\n\t\treturn volumespec.Parse(value)","sourceCodeStart":729,"sourceCodeEnd":765,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/cli/compose/loader/loader.go#L729-L765","documentation":"Thrown by transformStringSourceMap, the transformer for a single service `secrets`/`configs` entry (the short form). Each entry must be a string (source name) or a map (long form); anything else is rejected.","triggerScenarios":"A service's `secrets:` or `configs:` list contains an element that is neither a string nor a map — e.g. an int, a list, or null.","commonSituations":"Bad indentation collapsing a long-form map into a bare value; templating emitting null entries.","solutions":["Use the short form: `secrets: [token]`.","Or the long form: `secrets: [ { source: token } ]`."],"exampleFix":"# before\nweb:\n  secrets:\n    - token: mytoken\n# after\nweb:\n  secrets:\n    - source: mytoken","handlingStrategy":"type-guard","validationCode":"func validateSecretEntries(field string, entries any) error {\n    list, ok := entries.([]any)\n    if !ok {\n        return nil\n    }\n    for i, e := range list {\n        switch e.(type) {\n        case string, map[string]any:\n        default:\n            return fmt.Errorf(\"%s[%d]: invalid type %T\", field, i, e)\n        }\n    }\n    return nil\n}","typeGuard":"func isSecretEntry(v any) bool {\n    switch v.(type) {\n    case string, map[string]any:\n        return true\n    }\n    return false\n}","tryCatchPattern":null,"preventionTips":["Use short (`- token`) or long (`- source: token`) form for each entry.","Watch indentation so a long-form map stays a single map entry.","Lint rendered output."],"tags":["compose","secret","config","type-mismatch","service"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}