Our Discord bot stopped capturing voice audio on March 2, 2026 when Discord enforced DAVE (end-to-end encryption) on all voice channels. The fix required @snazzah/davey, a Rust NAPI-RS native binding. It worked locally but silently failed in production on our denoland/deno:alpine Docker image.
The symptom
Error: Cannot find native binding.
Davey's loader tried require('./davey.linux-x64-musl.node') and require('@snazzah/davey-linux-x64-musl'). Both failed. We copied the .node file right next to the loader. Still failed:
libc.so: cannot open shared object file: No such file or directory
The cause
The denoland/deno:alpine image is Alpine (musl) but ships its own glibc at /usr/local/lib/ for Deno itself. Alpine's musl libc lives at /lib/ld-musl-x86_64.so.1 with a versioned symlink at /lib/libc.musl-x86_64.so.1. But there is no plain libc.so.
NAPI-RS musl binaries link against libc.so. On a standard Alpine system ldd resolves this through the musl dynamic linker. But Deno's dlopen() looks for libc.so by name, doesn't find it, and fails.
The fix
RUN ln -s /lib/ld-musl-x86_64.so.1 /lib/libc.so
One line. Verified locally:
davey loaded: DAVE_PROTOCOL_VERSION = 1 VERSION = 0.1.10
Takeaway
If you use NAPI-RS packages with denoland/deno:alpine, you probably need this symlink. The error message points you toward npm optional dependency bugs, but the real problem is a missing shared library alias that standard Alpine doesn't need but Deno's dlopen does.