zed-industries/zed · error

Neither curl nor wget is available

Error message

Neither curl nor wget is available

What it means

To provision the remote server inside a container, Zed downloads the release with `curl -fL <url> -o <tmp>` over docker exec; if that fails and `which curl` also fails, it retries with wget, and only when `which wget` fails too does it bail. The container image simply ships no HTTP download tool.

Source

Thrown at crates/remote/src/transport/docker.rs:633

                log::info!("curl is not available, trying wget");
                match self
                    .run_docker_exec(
                        "wget",
                        Some(remote_dir_for_server),
                        &Default::default(),
                        &[url, "-O", &tmp_path_gz.display(self.path_style())],
                    )
                    .await
                {
                    Ok(_) => {}
                    Err(e) => {
                        if self
                            .run_docker_exec("which", None, &Default::default(), &["wget"])
                            .await
                            .is_ok()
                        {
                            return Err(e);
                        } else {
                            anyhow::bail!("Neither curl nor wget is available");
                        }
                    }
                }
            }
        }
        Ok(())
    }

    fn kill_inner(&self) -> Result<()> {
        if let Some(pid) = self.proxy_process.lock().take() {
            if let Ok(_) = util::command::new_command("kill")
                .arg(pid.to_string())
                .spawn()
            {
                Ok(())
            } else {

View on GitHub (pinned to 5a9b9558db)

Solutions

  1. Use an image with a downloader: alpine `apk add --no-cache curl`, debian `apt-get update && apt-get install -y curl`
  2. Switch to a fuller tag/base image of the same application and reconnect
  3. Pre-install the zed-remote-server binary into the image so no in-container download is needed
  4. With a dev-channel Zed, set ZED_BUILD_REMOTE_SERVER so the server is uploaded from the local machine instead of downloaded

Example fix

# before
FROM scratch
COPY app /app

# after
FROM alpine
RUN apk add --no-cache curl
COPY app /app
Defensive patterns

Strategy: fallback

Validate before calling

async fn container_has_download_tool(conn: &DockerExecConnection) -> bool {
    conn.run_docker_exec("which", None, &Default::default(), &["curl"])
        .await
        .is_ok()
        || conn.run_docker_exec("which", None, &Default::default(), &["wget"])
            .await
            .is_ok()
}

Try / catch

if let Err(e) = download_result {
    if e.to_string().contains("Neither curl nor wget") {
        // fallback: upload the server binary from the local machine (ZED_BUILD_REMOTE_SERVER)
        // or ask the user to switch to an image with curl/wget
    }
    return Err(e);
}

Prevention

When it happens

Trigger: run_docker_exec('curl', ...) errors because curl is absent, the `which curl` probe fails, the wget attempt also errors, and the `which wget` probe fails — typical of scratch, distroless, or stripped-down images.

Common situations: FROM scratch / distroless images containing only the app binary; hardened Chainguard-style images without a package manager; CI images trimmed for size; sidecar containers used as dev environments.

Related errors


AI-assisted analysis of zed-industries/zed@5a9b9558db (2026-08-20). Data as JSON: /api/errors/505ab72adc8a862b. Report an issue: GitHub.