Problem
Elixir's Matrex library (and potentially Python's NumPy/SciPy) fail to load NIF (Native Implemented Function) libraries in the runtime stage due to missing BLAS/LAPACK runtime dependencies.
Error Message
Error loading NIF Failed to load NIF library /judge/main/_build/prod/rel/main/lib/matrex-0.6.8/priv/matrix_nifs:
'libblas.so.3: cannot open shared object file: No such file or directory'
Reproduction
# In container with Full version
cd /root/contest/test_elixir
# Create test file using Matrex
cat > Main.ex << 'EOF'
defmodule Main do
def main do
mx = Matrex.new([[1, 2], [3, 4]])
scaled = Matrex.multiply(mx, 2)
IO.puts("Result: #{inspect(Matrex.to_list_of_lists(scaled))}")
end
end
EOF
# Run in strict mode
STRICT_MODE=1 make PROG=elixir run
# Error: libblas.so.3: cannot open shared object file
Root Cause
Builder stage (line 53-54):
libblas-dev \
liblapack-dev \
✅ Development libraries are installed for building
Runtime stage (line 295-337):
❌ Runtime libraries (libblas3, liblapack3) are NOT installed
NIF libraries like Matrex require the runtime shared libraries (.so files) to be available at execution time.
Impact
Currently Affected
- ❌ Elixir Matrex: Matrix operations fail
- ⚠️ Python NumPy/SciPy: May have similar issues (needs verification)
Currently Working
- ✅ Elixir Nx: Pure Elixir implementation, no native dependencies
- ✅ Elixir Aja: Pure Elixir implementation
- ✅ Elixir EXLA: Not tested yet, but may have similar issues
Proposed Solution
Add runtime BLAS/LAPACK libraries to the runtime stage in both Dockerfile and Dockerfile.lite:
# Runtime stage
RUN apt-get update && \
apt-get install -y --no-install-recommends \
# ... existing packages ...
# BLAS/LAPACK runtime libraries for Matrex and NumPy/SciPy
libblas3 \
liblapack3 \
# ... rest of packages ...
File Locations
- Dockerfile: Around line 305 (runtime dependencies section)
- Dockerfile.lite: Around line 215 (runtime dependencies section)
Additional Notes
- These are runtime-only libraries (not
-dev versions), so they don't significantly increase image size
- Ubuntu 24.04 package names:
libblas3 and liblapack3
- This affects both Full and Lite versions since both include Elixir with mix dependencies
Testing After Fix
# Test Matrex
docker run --rm ghcr.io/smkwlab/atcoder-container:full-latest-amd64 \
sh -c 'cd /judge/main && echo "defmodule Main do; def main do; mx = Matrex.new([[1,2],[3,4]]); IO.inspect(mx); end; end" > lib/main.ex && MIX_ENV=prod mix release --quiet --overwrite && _build/prod/rel/main/bin/main eval Main.main'
# Test NumPy (verify it still works)
docker run --rm ghcr.io/smkwlab/atcoder-container:full-latest-amd64 \
python3.13 -c "import numpy; print('NumPy version:', numpy.__version__)"
Related
Problem
Elixir's Matrex library (and potentially Python's NumPy/SciPy) fail to load NIF (Native Implemented Function) libraries in the runtime stage due to missing BLAS/LAPACK runtime dependencies.
Error Message
Reproduction
Root Cause
Builder stage (line 53-54):
✅ Development libraries are installed for building
Runtime stage (line 295-337):
❌ Runtime libraries (
libblas3,liblapack3) are NOT installedNIF libraries like Matrex require the runtime shared libraries (
.sofiles) to be available at execution time.Impact
Currently Affected
Currently Working
Proposed Solution
Add runtime BLAS/LAPACK libraries to the runtime stage in both
DockerfileandDockerfile.lite:File Locations
Additional Notes
-devversions), so they don't significantly increase image sizelibblas3andliblapack3Testing After Fix
Related
/judge/main/mix.exsline 19