10 months ago
We're trying to deploy a FastAPI app with OpenCV on Railway, but it fails with "ImportError: libGL.so.1: cannot open shared object file: No such file or directory" when importing cv2, and our attempts to install system dependencies via nixpacks.toml are failing with "undefined variable" errors for packages like libsm, libGL, etc. - what's the correct way to install OpenGL/OpenCV system dependencies in Railway's Nixpacks environment?
PS. Also I was contacted on email by Melissa from Railway after my deployment failed. She was offering help, proposing to reply to her message directly. After I did so, my message bounced - apparently the group wasn't monitored. Frustrating experience across the board so far.
Pinned Solution
10 months ago
I believe Nixpacks' nixPkgs field is case-sensitive.
Can you please try changing libsm to libSM?
5 Replies
10 months ago
OpenCV is known to require a lot of apt system packaged. Can you share your nixpacks.toml?
Status changed to Awaiting User Response Railway • 10 months ago
angelo-railway
OpenCV is known to require a lot of apt system packaged. Can you share your nixpacks.toml?
10 months ago
my current nixpacks.toml:
toml[phases.setup]
nixPkgs = ["libGL", "glib", "libsm", "libxext", "libxrender"]
[variables]
QT_QPA_PLATFORM = "offscreen"
OPENCV_IO_ENABLE_OPENEXR = "1"I'm getting build failures - error: undefined variable 'libsm'
My app uses opencv-python-headless==4.8.0.74 with ultralytics for YOLO inference
Status changed to Awaiting Railway Response Railway • 10 months ago
spiral25
my current nixpacks.toml:toml[phases.setup] nixPkgs = ["libGL", "glib", "libsm", "libxext", "libxrender"] [variables] QT_QPA_PLATFORM = "offscreen" OPENCV_IO_ENABLE_OPENEXR = "1"I'm getting build failures - error: undefined variable 'libsm'My app uses opencv-python-headless==4.8.0.74 with ultralytics for YOLO inference
10 months ago
I believe Nixpacks' nixPkgs field is case-sensitive.
Can you please try changing libsm to libSM?
samgordon
I believe Nixpacks' nixPkgs field is case-sensitive.Can you please try changing libsm to libSM?
10 months ago
Thank you for the hint! This helped to progress one more step. After a few more iterations with chats, I ended up having this
# nixpacks.toml
providers = ["python"]
[variables]
PYTHONUNBUFFERED = "1"
[build]
nixpkgsArchive = "https://github.com/NixOS/nixpkgs/archive/refs/tags/23.05.tar.gz"
[phases.setup]
nixPkgs = ["python312", "gcc", "libGL", "glib", "glibc", "libGLU", "pkg-config"]
[phases.install]
cmds = [
"python -m venv --copies /opt/venv",
". /opt/venv/bin/activate && pip install -r requirements.txt"
]
cmds = [
"chmod +x /app/boot.sh",
"echo 'Linking OpenCV dependencies...'",
"GL=$(find /nix/store -name 'libGL.so.1' | head -n 1) && ln -sf $GL /usr/lib/libGL.so.1 || echo 'libGL link failed'",
"GLIB=$(find /nix/store -name 'libglib-2.0.so.0' | head -n 1) && ln -sf $GLIB /usr/lib/libglib-2.0.so.0 || echo 'glib link failed'",
"GTHREAD=$(find /nix/store -name 'libgthread-2.0.so.0' | head -n 1) && ln -sf $GTHREAD /usr/lib/libgthread-2.0.so.0 || echo 'gthread link failed'",
"ldd /opt/venv/lib/python3.12/site-packages/cv2/*.so || echo 'ldd check failed'"
]
[start]
cmd = "./boot.sh uvicorn app:app --host 0.0.0.0 --port 8000"
and also
boot.sh
#!/bin/bash
echo "[runtime] Linking missing shared libs..."
GL=$(find /nix/store -name 'libGL.so.1' | head -n 1)
GLIB=$(find /nix/store -name 'libglib-2.0.so.0' | head -n 1)
GTHREAD=$(find /nix/store -name 'libgthread-2.0.so.0' | head -n 1)
ln -sf "$GL" /usr/lib/libGL.so.1
ln -sf "$GLIB" /usr/lib/libglib-2.0.so.0
ln -sf "$GTHREAD" /usr/lib/libgthread-2.0.so.0
echo "[runtime] Running app..."
exec "$@"
Deployed successfully now.
spiral25
Thank you for the hint! This helped to progress one more step. After a few more iterations with chats, I ended up having this# nixpacks.tomlproviders = ["python"][variables]PYTHONUNBUFFERED = "1"[build]nixpkgsArchive = "https://github.com/NixOS/nixpkgs/archive/refs/tags/23.05.tar.gz"[phases.setup]nixPkgs = ["python312", "gcc", "libGL", "glib", "glibc", "libGLU", "pkg-config"][phases.install]cmds = ["python -m venv --copies /opt/venv",". /opt/venv/bin/activate && pip install -r requirements.txt"][phases.build]cmds = ["chmod +x /app/boot.sh","echo 'Linking OpenCV dependencies...'","GL=$(find /nix/store -name 'libGL.so.1' | head -n 1) && ln -sf $GL /usr/lib/libGL.so.1 || echo 'libGL link failed'","GLIB=$(find /nix/store -name 'libglib-2.0.so.0' | head -n 1) && ln -sf $GLIB /usr/lib/libglib-2.0.so.0 || echo 'glib link failed'","GTHREAD=$(find /nix/store -name 'libgthread-2.0.so.0' | head -n 1) && ln -sf $GTHREAD /usr/lib/libgthread-2.0.so.0 || echo 'gthread link failed'","ldd /opt/venv/lib/python3.12/site-packages/cv2/*.so || echo 'ldd check failed'"][start]cmd = "./boot.sh uvicorn app:app --host 0.0.0.0 --port 8000"and alsoboot.sh#!/bin/bash echo "[runtime] Linking missing shared libs..." GL=$(find /nix/store -name 'libGL.so.1' | head -n 1) GLIB=$(find /nix/store -name 'libglib-2.0.so.0' | head -n 1) GTHREAD=$(find /nix/store -name 'libgthread-2.0.so.0' | head -n 1) ln -sf "$GL" /usr/lib/libGL.so.1 ln -sf "$GLIB" /usr/lib/libglib-2.0.so.0 ln -sf "$GTHREAD" /usr/lib/libgthread-2.0.so.0 echo "[runtime] Running app..." exec "$@"Deployed successfully now.
10 months ago
Glad to hear you solved it!
Status changed to Solved chandrika • 10 months ago