{"record":{"id":"9f9777b538399cbf","repo":"cross-rs/cross","slug":"want-driver-overlay2-got-driver-name","errorCode":null,"errorMessage":"want driver overlay2, got {driver_name}","messagePattern":"want driver overlay2, got (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/docker/shared.rs","lineNumber":1427,"sourceCode":"\nfn dockerinfo_parse_root_mount_path(info: &serde_json::Value) -> Result<MountDetail> {\n    let driver_name = info\n        .pointer(\"/0/GraphDriver/Name\")\n        .and_then(|v| v.as_str())\n        .ok_or_else(|| eyre::eyre!(\"no driver name found\"))?;\n\n    if driver_name.to_lowercase().contains(\"overlay\") {\n        let path = info\n            .pointer(\"/0/GraphDriver/Data/MergedDir\")\n            .and_then(|v| v.as_str())\n            .ok_or_else(|| eyre::eyre!(\"No merge directory found\"))?;\n\n        Ok(MountDetail {\n            source: PathBuf::from(&path),\n            destination: PathBuf::from(\"/\"),\n        })\n    } else {\n        eyre::bail!(\"want driver overlay2, got {driver_name}\")\n    }\n}\n\nfn dockerinfo_parse_user_mounts(info: &serde_json::Value) -> Vec<MountDetail> {\n    info.pointer(\"/0/Mounts\")\n        .and_then(|v| v.as_array())\n        .map_or_else(Vec::new, |v| {\n            let make_path = |v: &serde_json::Value| {\n                PathBuf::from(&v.as_str().expect(\"docker mount should be defined\"))\n            };\n            let mut mounts = vec![];\n            for details in v {\n                let source = make_path(&details[\"Source\"]);\n                let destination = make_path(&details[\"Destination\"]);\n                mounts.push(MountDetail {\n                    source,\n                    destination,\n                });","sourceCodeStart":1409,"sourceCodeEnd":1445,"githubUrl":"https://github.com/cross-rs/cross/blob/8c1a8aa4b661711f4b7b6ac07c2e8929ce2f7d27/src/docker/shared.rs#L1409-L1445","documentation":"When parsing `docker info` output to locate user mounts, cross only supports containers backed by the overlay2 storage driver. `dockerinfo_parse_rootful_mount` (or nearby) builds a MountDetail only when the driver name is overlay2; otherwise it bails with the actual driver name it saw.","triggerScenarios":"Running cross against a Docker daemon whose storage driver is not overlay2 (e.g. vfs, devicemapper, btrfs, zfs, fuse-overlayfs) while cross inspects root mounts from `docker info`.","commonSituations":"Rootless Docker or Podman setups using alternative snapshot/storage drivers; older kernels falling back to vfs; distros with devicemapper storage.","solutions":["Check `docker info --format '{{.Driver}}'` and reconfigure the daemon to use overlay2 (set \"storage-driver\": \"overlay2\" in daemon.json).","On rootless setups, switch to a rootless driver that reports overlay2/fuse-overlayfs or migrate storage.","Upgrade the host/kernel so overlay2 is supported, then restart the daemon."],"exampleFix":"// /etc/docker/daemon.json\n// before\n{ }\n// after\n{ \"storage-driver\": \"overlay2\" }","handlingStrategy":"validation","validationCode":"const { execSync } = require('child_process');\nfunction assertOverlay2() {\n  const driver = execSync(\"docker info --format '{{.Driver}}'\").toString().trim();\n  if (driver !== 'overlay2') {\n    throw new Error(`docker storage driver is ${driver}; overlay2 required`);\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check `docker info` storage driver before cross builds in CI.","Pin \"storage-driver\": \"overlay2\" in /etc/docker/daemon.json.","Keep the host kernel updated so overlay2 stays supported."],"tags":["docker","storage-driver","overlay2","configuration"],"backgroundTag":"invalid-config-value","analyzedSha":"8c1a8aa4b661711f4b7b6ac07c2e8929ce2f7d27","analyzedAt":"2026-09-13T15:10:43.988Z","contentChangedAt":"2026-09-13T15:10:43.988Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}