{"record":{"id":"b4f06f3128f01585","repo":"dagger/dagger","slug":"parse-runner-host-w","errorCode":null,"errorMessage":"parse runner host: %w","messagePattern":"parse runner host: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/client/client.go","lineNumber":455,"sourceCode":"\t\t\tc.sessionSrv.Stop()\n\t\t}\n\t}()\n\n\tif err := c.subscribeTelemetry(connectCtx); err != nil {\n\t\treturn nil, fmt.Errorf(\"subscribe to telemetry: %w\", err)\n\t}\n\n\tif err := c.daggerConnect(ctx); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to connect to dagger: %w\", err)\n\t}\n\n\treturn c, nil\n}\n\nfunc (c *Client) startEngine(ctx context.Context, params Params) (rerr error) {\n\tremote, err := url.Parse(c.RunnerHost)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"parse runner host: %w\", err)\n\t}\n\n\tdriver, err := drivers.GetDriver(ctx, remote.Scheme)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar cloudToken string\n\tif v, ok := os.LookupEnv(drivers.EnvDaggerCloudToken); ok {\n\t\tcloudToken = v\n\t} else if _, ok := os.LookupEnv(envDaggerCloudCachetoken); ok {\n\t\tcloudToken = v\n\t}\n\n\tif c.CloudURLCallback != nil {\n\t\tif url, msg, ok := enginetel.URLForTrace(ctx); ok {\n\t\t\tc.CloudURLCallback(ctx, url, msg, ok)\n\t\t} else {","sourceCodeStart":437,"sourceCodeEnd":473,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/engine/client/client.go#L437-L473","documentation":"Wraps a failure of url.Parse(c.RunnerHost) at the top of startEngine. Before selecting a driver, the client parses the runner host string as a URL to read its scheme; if the string is not a valid absolute URL (bad scheme syntax, control characters, missing scheme), parsing fails and the connect is aborted.","triggerScenarios":"Calling Connect or ConnectEngineToEngine with a Params.RunnerHost (or env-provided runner host) that is not a parseable URL — e.g. \"docker:/\", spaces, or garbage strings.","commonSituations":"Typo'd DAGGER_RUNNER_HOST value (e.g. missing colon: \"docker//container\"); shell interpolation injecting whitespace; environment variable set from a mis-templated config.","solutions":["Print and fix the RunnerHost value; ensure it is a valid URL like docker://engine or udp://1.2.3.4","Check the env var feeding RunnerHost (e.g. DAGGER_RUNNER_HOST) for typos/extra characters","Quote the value in shell/scripts to avoid stray spaces"],"exampleFix":"// before\nos.Setenv(\"DAGGER_RUNNER_HOST\", \"docker//my-engine\")\nclient, err := dagger.Connect(ctx)\n// after\nos.Setenv(\"DAGGER_RUNNER_HOST\", \"docker-container://my-engine\")\nclient, err := dagger.Connect(ctx)","handlingStrategy":"validation","validationCode":"runnerHost := os.Getenv(\"DAGGER_RUNNER_HOST\")\nif u, err := url.Parse(runnerHost); err != nil || u.Scheme == \"\" {\n    return fmt.Errorf(\"DAGGER_RUNNER_HOST %q is not a valid URL with a scheme\", runnerHost)\n}","typeGuard":"func isValidRunnerHost(s string) bool {\n    u, err := url.Parse(s)\n    return err == nil && u.Scheme != \"\"\n}","tryCatchPattern":"client, err := dagger.Connect(ctx)\nif err != nil && strings.Contains(err.Error(), \"parse runner host\") {\n    return fmt.Errorf(\"check DAGGER_RUNNER_HOST: %w\", err)\n}","preventionTips":["Validate runner host with url.Parse before calling Connect","Quote env values in scripts to avoid stray spaces","Use the documented scheme format (e.g. docker-container://name)","Test env-var templating in CI configs"],"tags":["configuration","url","validation"],"backgroundTag":"invalid-url","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}