What happened?
bin/local-dev.sh up cannot bring the stack up on Linux. The script already
carries Linux support in places (_find_jdk17 globs /usr/lib/jvm/*, the
docker install hint has a Linux: line), but three platform assumptions are
macOS-only. The first is fatal, the other two degrade silently.
| # |
Where |
Assumption |
Effect on Linux |
| 1 |
_detect_host_lan_ip (main.sh ~465) |
route get default, ipconfig getifaddr en0..en10 |
Neither command exists (route is net-tools with different syntax; ipconfig is macOS/Windows; interfaces are eth0/enp*, not en0). _require_host_lan_ip aborts up/auto. Hard blocker. |
| 2 |
svc_artifact_mtime (main.sh 1674, 1680, 1681) |
BSD stat -f "%Sm" -t FMT |
GNU coreutils stat reads -f as "file system info" and treats the format strings as filenames: it writes an error to stderr, prints filesystem garbage on stdout, and exits 1. watch's ARTIFACT MTIME column renders that garbage (the JVM call site at 1674 has no 2>/dev/null guard at all, so the error also leaks into the table). |
| 3 |
listen_pid_for_port (main.sh ~1199) |
lsof is installed |
lsof is not a default package on Debian/Ubuntu/Fedora. Without it every service reads as stopped, so up re-launches services that are already running and down silently no-ops. |
The in-file comment on the second LAN-IP loop even says it is the "linux
hostname -I-equivalent walk", but the body still calls ipconfig.
Before: linux + up -> FATAL: could not detect a host LAN IP
After: linux + up -> LAN IP from `ip route` / `ip -4 addr`, stack comes up
Detection has to keep excluding loopback and the docker bridge: on a
typical box hostname -I prints 10.10.10.30 172.17.0.1, and picking
172.17.0.1 (docker0) would defeat the purpose of the variable, which is to
be one address reachable from both the host JVMs and the lakekeeper
container.
Two smaller things in _install_hint while we're here: the docker hint names a
package that does not exist on stock Ubuntu — docker-compose-plugin only
ships in Docker's own apt repo, the distro package is docker-compose-v2 — and
the node / yarn / bun cases have no Linux: line at all (java,
python, sbt and docker do).
How to reproduce?
On any Linux host (reproduced on Ubuntu 24.04.4, x86_64) with JDK 17, sbt,
node, yarn, bun and docker all installed:
bin/local-dev.sh up
# FATAL: could not detect a host LAN IP.
HOST_LAN_IP=$(ip -4 route get 1.1.1.1 | awk '{print $7; exit}') bin/local-dev.sh up
# now proceeds and the stack comes up
For #2 and #3, with the stack up:
stat -f "%Sm" -t "%Y-%m-%d %H:%M" build.sbt # GNU stat: error + garbage, rc=1
bin/local-dev.sh watch # ARTIFACT MTIME column is garbage
# simulate a box without lsof
d=$(mktemp -d); printf '#!/bin/sh\nexit 127\n' > "$d/lsof"; chmod +x "$d/lsof"
PATH="$d:$PATH" bin/local-dev.sh status # all 9 native services read "stopped"
Version/Branch
1.3.0-incubating-SNAPSHOT (main)
Relevant log output
FATAL: could not detect a host LAN IP.
MinIO needs an address reachable from both docker (lakekeeper
does S3 ops) and the host (JVMs read signed URLs back); none
of `route get default` / en0-en10 had a non-loopback IPv4.
Connect to a network or export HOST_LAN_IP=<your-IP> explicitly.
$ stat -f "%Sm" -t "%Y-%m-%d %H:%M" some.jar
stat: cannot read file system information for '%Sm': No such file or directory
What happened?
bin/local-dev.sh upcannot bring the stack up on Linux. The script alreadycarries Linux support in places (
_find_jdk17globs/usr/lib/jvm/*, thedocker install hint has a
Linux:line), but three platform assumptions aremacOS-only. The first is fatal, the other two degrade silently.
_detect_host_lan_ip(main.sh ~465)route get default,ipconfig getifaddr en0..en10routeis net-tools with different syntax;ipconfigis macOS/Windows; interfaces areeth0/enp*, noten0)._require_host_lan_ipabortsup/auto. Hard blocker.svc_artifact_mtime(main.sh 1674, 1680, 1681)stat -f "%Sm" -t FMTstatreads-fas "file system info" and treats the format strings as filenames: it writes an error to stderr, prints filesystem garbage on stdout, and exits 1.watch's ARTIFACT MTIME column renders that garbage (the JVM call site at 1674 has no2>/dev/nullguard at all, so the error also leaks into the table).listen_pid_for_port(main.sh ~1199)lsofis installedlsofis not a default package on Debian/Ubuntu/Fedora. Without it every service reads asstopped, soupre-launches services that are already running anddownsilently no-ops.The in-file comment on the second LAN-IP loop even says it is the "linux
hostname -I-equivalent walk", but the body still callsipconfig.Detection has to keep excluding loopback and the docker bridge: on a
typical box
hostname -Iprints10.10.10.30 172.17.0.1, and picking172.17.0.1(docker0) would defeat the purpose of the variable, which is tobe one address reachable from both the host JVMs and the lakekeeper
container.
Two smaller things in
_install_hintwhile we're here: the docker hint names apackage that does not exist on stock Ubuntu —
docker-compose-pluginonlyships in Docker's own apt repo, the distro package is
docker-compose-v2— andthe
node/yarn/buncases have noLinux:line at all (java,python,sbtanddockerdo).How to reproduce?
On any Linux host (reproduced on Ubuntu 24.04.4, x86_64) with JDK 17, sbt,
node, yarn, bun and docker all installed:
For #2 and #3, with the stack up:
Version/Branch
1.3.0-incubating-SNAPSHOT (main)
Relevant log output
FATAL: could not detect a host LAN IP. MinIO needs an address reachable from both docker (lakekeeper does S3 ops) and the host (JVMs read signed URLs back); none of `route get default` / en0-en10 had a non-loopback IPv4. Connect to a network or export HOST_LAN_IP=<your-IP> explicitly. $ stat -f "%Sm" -t "%Y-%m-%d %H:%M" some.jar stat: cannot read file system information for '%Sm': No such file or directory