{"record":{"id":"d0e04f1870b121fa","repo":"GoogleContainerTools/skaffold","slug":"response-must-be-a-number-or-empty","errorCode":null,"errorMessage":"response must be a number, or empty","messagePattern":"response must be a number, or empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"pkg/skaffold/initializer/prompt/prompt.go","lineNumber":104,"sourceCode":"\t\tOptions: builders,\n\t}\n\terr := askOne(prompt, &chosen)\n\tif err != nil {\n\t\treturn []string{}, fmt.Errorf(\"getting user choices\")\n\t}\n\n\treturn chosen, err\n}\n\n// PortForwardResource prompts the user to give a port to forward the current resource on\nfunc portForwardResource(out io.Writer, imageName string) (int, error) {\n\tvar response string\n\tprompt := &survey.Question{\n\t\tPrompt: &survey.Input{Message: fmt.Sprintf(\"Select port to forward for %s (leave blank for none):\", imageName)},\n\t\tValidate: func(val interface{}) error {\n\t\t\tstr := val.(string)\n\t\t\tif _, err := strconv.Atoi(str); err != nil && str != \"\" {\n\t\t\t\treturn errors.New(\"response must be a number, or empty\")\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\terr := ask([]*survey.Question{prompt}, &response)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"reading user input: %w\", err)\n\t}\n\n\tresponse = strings.ToLower(strings.TrimSpace(response))\n\tif response == \"\" {\n\t\treturn 0, nil\n\t}\n\n\tresponseInt, _ := strconv.Atoi(response)\n\treturn responseInt, nil\n}\n","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/initializer/prompt/prompt.go#L86-L122","documentation":"During skaffold initializer prompting, the user is asked to select a port to forward for each discovered image. The survey validator attempts strconv.Atoi on the response and, if it is neither a number nor an empty string, returns 'response must be a number, or empty'. This is interactive input validation, not an internal failure.","triggerScenarios":"Typing non-numeric input (e.g. '8080/tcp', 'eighty', '8o80') at the 'Select port to forward for <image>' prompt instead of a number or blank line.","commonSituations":"Copy-pasting a port mapping like '0.0.0.0:8080->80/tcp' from docker ps output; typos; pasting with trailing whitespace/characters; expecting to enter a protocol suffix.","solutions":["Enter just the numeric port (e.g. 8080) or press Enter to skip forwarding for that image","If pasting from docker ps, extract only the container port number from the mapping","Rerun skaffold init and answer prompts carefully; use the --portforward flag or edit skaffold.yaml afterward to set port forwards non-interactively"],"exampleFix":"// before (prompt input)\nSelect port to forward for my-image: 0.0.0.0:8080->80/tcp\n// after\nSelect port to forward for my-image: 8080\n# or leave blank to skip","handlingStrategy":"validation","validationCode":"func validPortAnswer(s string) bool {\n    if s == \"\" { return true }\n    _, err := strconv.Atoi(strings.TrimSpace(s))\n    return err == nil\n}","typeGuard":"func isPortNumber(val interface{}) bool {\n    s, ok := val.(string)\n    if !ok { return false }\n    if s == \"\" { return true }\n    n, err := strconv.Atoi(s)\n    return err == nil && n > 0 && n < 65536\n}","tryCatchPattern":"if err := ask(questions, &response); err != nil {\n    if strings.Contains(err.Error(), \"response must be a number, or empty\") {\n        fmt.Println(\"Enter a plain number (e.g. 8080) or press Enter to skip.\")\n        err = ask(questions, &response) // re-prompt\n    }\n}","preventionTips":["Enter only digits at port prompts; no mappings or protocol suffixes","Use non-interactive flags (--default-repo, --portforward) or edit skaffold.yaml to avoid prompts in CI","Trim pasted docker ps output to just the container port"],"tags":["interactive","validation","port-forwarding","initializer"],"backgroundTag":"invalid-user-input","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}