{"record":{"id":"bd32b664e7ed9d4a","repo":"wagoodman/dive","slug":"could-not-determine-docker-host-v","errorCode":null,"errorMessage":"could not determine docker host: %v","messagePattern":"could not determine docker host: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"dive/image/docker/engine_resolver.go","lineNumber":75,"sourceCode":"\treader, err := r.fetchArchive(ctx, id)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := ExtractFromImage(io.NopCloser(reader), l, p); err == nil {\n\t\treturn nil\n\t}\n\n\treturn fmt.Errorf(\"unable to extract from image '%s': %+v\", id, err)\n}\n\nfunc (r *engineResolver) fetchArchive(ctx context.Context, id string) (io.ReadCloser, error) {\n\tvar err error\n\tvar dockerClient *client.Client\n\n\thost, err := determineDockerHost()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not determine docker host: %v\", err)\n\t}\n\tclientOpts := []client.Opt{client.FromEnv}\n\tclientOpts = append(clientOpts, client.WithHost(host))\n\n\tswitch strings.Split(host, \":\")[0] {\n\tcase \"ssh\":\n\t\thelper, err := connhelper.GetConnectionHelper(host)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to get docker connection helper: %w\", err)\n\t\t}\n\t\tclientOpts = append(clientOpts, func(c *client.Client) error {\n\t\t\thttpClient := &http.Client{\n\t\t\t\tTransport: &http.Transport{\n\t\t\t\t\tDialContext: helper.Dialer,\n\t\t\t\t},\n\t\t\t}\n\t\t\treturn client.WithHTTPClient(httpClient)(c)\n\t\t})","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/wagoodman/dive/blob/d6c691947f8fda635c952a17ee3b7555379d58f0/dive/image/docker/engine_resolver.go#L57-L93","documentation":"Returned by engineResolver.fetchArchive (dive/image/docker/engine_resolver.go:75) wrapping a failure of determineDockerHost(). That helper reads DOCKER_HOST, then DOCKER_CONTEXT, then ~/.docker/config.json (cliconfig.Load), then resolves the named context from the context store (~/.docker/contexts). Any failure loading the config file or fetching context metadata surfaces here as 'could not determine docker host: %v'.","triggerScenarios":"Malformed ~/.docker/config.json (bad JSON, wrong perms) that cliconfig.Load rejects; DOCKER_CONTEXT (or config's currentContext) naming a context whose metadata cannot be read - deleted context dir, partial write, version-incompatible context store.","commonSituations":"Manually edited or tool-generated docker config files; contexts created by Docker Desktop removed out-of-band; home-dir sync/restore that half-copied ~/.docker/contexts; switching between Docker Desktop and plain engine installs.","solutions":["Validate the config: docker context ls and docker info - if the docker CLI itself errors, fix that first","Check ~/.docker/config.json parses (jq . ~/.docker/config.json) and has sane permissions","Remove or recreate the stale context: docker context rm <name> && docker context create ...; or docker context use default","Bypass context resolution for the dive run: DOCKER_HOST=unix:///var/run/docker.sock dive docker://<image>"],"exampleFix":"# before: stale context referenced in config\n$ dive docker://alpine\nError: could not determine docker host: ...\n\n# after: pin the host explicitly for this run\n$ DOCKER_HOST=unix:///var/run/docker.sock dive docker://alpine","handlingStrategy":"validation","validationCode":"// pre-flight docker environment check\nfunc dockerEnvOK() error {\n    if os.Getenv(\"DOCKER_HOST\") != \"\" {\n        return nil // explicit host wins; no context resolution needed\n    }\n    if b, err := os.ReadFile(filepath.Join(os.Getenv(\"HOME\"), \".docker\", \"config.json\")); err == nil {\n        if !json.Valid(b) {\n            return fmt.Errorf(\"~/.docker/config.json is not valid JSON\")\n        }\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"reader, err := resolver.Fetch(ctx, id)\nif err != nil && strings.Contains(err.Error(), \"could not determine docker host\") {\n    // recover by pinning the host explicitly for this process\n    os.Setenv(\"DOCKER_HOST\", \"unix:///var/run/docker.sock\")\n    reader, err = resolver.Fetch(ctx, id)\n}\nif err != nil {\n    return err\n}","preventionTips":["Set DOCKER_HOST explicitly in CI to bypass context resolution","Keep ~/.docker/config.json valid (verify with jq) and prune stale contexts (docker context ls)","After removing Docker Desktop or contexts, run 'docker context use default'"],"tags":["docker","configuration","docker-context","environment"],"backgroundTag":null,"analyzedSha":"d6c691947f8fda635c952a17ee3b7555379d58f0","analyzedAt":"2026-08-15T09:42:35.293Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}