OSError: [Errno 99] Cannot assign requested address when starting jupyter
Fixes `OSError: [Errno 99] Cannot assign requested address` when starting Jupyter: the configured IP is not assigned to any local interface. Bind to the all-interfaces address or a real local IP instead. Not for port conflicts.
TL;DR
Errno 99 means Jupyter tried to bind to an IP address this machine does not have, usually because a config file hardcodes an old IP or a container passes the host's address. Find the configured IP in jupyter_server_config.py or the --ip flag. Change it to the all-interfaces address so the server binds to every local interface, or set it to an address the machine actually holds.
OSError: [Errno 99] Cannot assign requested addressUse this when
- The server fails during startup with Errno 99 before serving anything.
- A config file or launch script passes
--ipwith a specific address. - The machine's IP changed (new network, moved container, DHCP renewal).
Not for this skill when
- The error is Errno 98 / address already in use. That is a port conflict.
- The server starts but browsers cannot connect. That is firewall or proxy.
Steps
- Find the configured IP:
grep -rn "c.ServerApp.ip" ~/.jupyter/and check your launch command for--ip. Verify: you know which address it wants. - List the machine's addresses:
ip addr show(orifconfig). Verify: the configured IP is absent from the list. - Change the config to the all-interfaces address, or to one of the listed addresses. Verify: the config file or flag now names a valid target.
- Start the server. Verify: the startup log shows it listening without Errno 99.
- If a container orchestrator injects the IP, fix the injection (env var or entrypoint) rather than the config file. Verify: a fresh container starts cleanly.
Variant phrasings
errno 99 jupyter cannot assign requested address
Short form. The IP is not local.
jupyter server won't start errno 99
Symptom phrasing. Check the bind address.
cannot assign requested address notebook server
General phrasing. Same bind-address fix.
Compatibility: All jupyter_server versions. The bind semantics come from the OS socket layer, not Jupyter.
Why it happens
Binding a socket to a specific IP requires that IP to be assigned to a local interface. Configs copied between machines, containers that hardcode the host's IP, and laptops that changed networks all produce the same failure: Jupyter asks the OS for an address the OS has never heard of, and the OS refuses with Errno 99 before Jupyter prints anything useful.
Edge cases / pitfalls
- Binding to the all-interfaces address exposes the server on every network interface. Set a token or password; do not rely on obscurity.
- VPN connect/disconnect cycles add and remove interface addresses. A config that worked pre-VPN can Errno-99 post-VPN.
- In Docker, the container never has the host's IP. Bind to the all-interfaces address inside the container and publish the port.
- IPv6 vs IPv4 matters: an IPv4 literal on an IPv6-only interface also raises Errno 99. Match the address family.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_HUzL-MlN1JYkpM-WYP-uSw