{"record":{"id":"4e42ed56ade12c4b","repo":"GoogleContainerTools/skaffold","slug":"starting-http-server-w","errorCode":null,"errorMessage":"starting HTTP server: %w","messagePattern":"starting HTTP server: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/server/server.go","lineNumber":165,"sourceCode":"\t\t\tlogFileErr := event.SaveEventsToFile(opts.EventLogFile)\n\t\t\tif logFileErr != nil {\n\t\t\t\terrStr += fmt.Sprintf(\"event log file error: %s\\n\", logFileErr.Error())\n\t\t\t}\n\n\t\t\tv2EventLogFile := fmt.Sprintf(`%s.v2`, opts.EventLogFile)\n\t\t\tlogFileV2Err := eventV2.SaveEventsToFile(v2EventLogFile)\n\t\t\tif logFileV2Err != nil {\n\t\t\t\terrStr += fmt.Sprintf(\"eventV2 log file error: %s\\n\", logFileV2Err.Error())\n\t\t\t}\n\t\t}\n\n\t\t// Save logs from current run to file\n\t\teventV2.SaveLastLog(opts.LastLogFile)\n\n\t\treturn errors.New(errStr)\n\t}\n\tif err != nil {\n\t\treturn callback, fmt.Errorf(\"starting HTTP server: %w\", err)\n\t}\n\n\tif opts.EnableRPC && opts.RPCPort.Value() == nil && opts.RPCHTTPPort.Value() == nil {\n\t\tlog.Entry(context.TODO()).Warnf(\"started skaffold gRPC API on random port %d\", grpcPort)\n\t}\n\n\treturn callback, nil\n}\n\nfunc newGRPCServer(preferredPort int) (func() error, int, error) {\n\tl, port, err := listenPort(preferredPort)\n\tif err != nil {\n\t\treturn func() error { return nil }, 0, fmt.Errorf(\"creating listener: %w\", err)\n\t}\n\n\tlog.Entry(context.TODO()).Infof(\"starting gRPC server on port %d\", port)\n\n\ts := grpc.NewServer()","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/server/server.go#L147-L183","documentation":"server.Initialize wraps failures from newHTTPServer — which serves the HTTP variant of the Skaffold API and proxies to the gRPC port — as 'starting HTTP server: %w'. This happens after the gRPC server started successfully, when --rpc-http-port was requested and its listener could not be created.","triggerScenarios":"Calling Initialize(opts) with a non-nil opts.RPCHTTPPort and newHTTPServer(port, grpcPort) fails at listenPort: the requested HTTP port is occupied, privileged, or otherwise unbindable.","commonSituations":"Another skaffold run or an IDE plugin already holds the --rpc-http-port; the port collides with a locally running web server; container environments restricting port binding.","solutions":["Free the HTTP port (lsof -i :PORT / ss -ltnp) and stop the conflicting process.","Pick a different port via --rpc-http-port, or drop the flag entirely (skaffold then only runs the gRPC API on a chosen port).","Note the gRPC server is already up when this fires: the returned shutdown callback will tear it down; simply retry after fixing the HTTP port.","Ensure the port is unprivileged or the process has permission to bind it."],"exampleFix":"// before\nskaffold dev --rpc-http-port 50052 // in use\n\n// after\nskaffold dev --rpc-http-port 50053\n# or omit the flag:\nskaffold dev --rpc-port 50051","handlingStrategy":"retry","validationCode":"if opts.RPCHTTPPort.Value() != nil {\n\tport := *opts.RPCHTTPPort.Value()\n\tl, err := net.Listen(\"tcp\", fmt.Sprintf(\"127.0.0.1:%d\", port))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"http port %d unavailable: %w\", port, err)\n\t}\n\tl.Close()\n}","typeGuard":null,"tryCatchPattern":"cb, err := server.Initialize(opts)\nif err != nil && strings.Contains(err.Error(), \"starting HTTP server\") {\n\t// give up the fixed HTTP port and retry without it (gRPC API still available)\n\topts.RPCHTTPPort = nil\n\tcb, err = server.Initialize(opts)\n}\nif err != nil {\n\treturn err\n}","preventionTips":["Choose an --rpc-http-port distinct from the --rpc-port and other local servers","Verify the port is free with ss -ltnp or lsof before launching","Omit --rpc-http-port when only the gRPC API is needed","Use unprivileged ports in containers/CI"],"tags":["http","network","port-in-use","skaffold"],"backgroundTag":"port-already-in-use","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"}