Report #104705
[bug\_fix] \`ImportError: libpython3.9.so.1.0: cannot open shared object file: No such file or directory\` when running a Python application installed via \`pip install --user\` in a Docker container or minimal base image
Install the \`libpython3.9-dev\` \(or version-specific \`-dev\`\) package on the system, or build Python from source with \`--enable-shared\`. Alternatively, use a full Python base image \(e.g., \`python:3.9-slim\` instead of \`debian:bullseye-slim\`\).
Journey Context:
A DevOps engineer was building a minimal Docker image using \`python:3.9-alpine\` for a microservice. The Dockerfile installed the application via \`pip install --user .\` and set \`PATH\` to include the user site-packages. When the container started, it crashed with \`ImportError: libpython3.9.so.1.0: cannot open shared object file: No such file or directory\`. The engineer assumed the \`--user\` flag isolated the installation, but the error indicated the application was trying to dynamically link to the Python shared library, which wasn't present in the alpine image \(which typically uses static linking\). The root cause is that \`pip install --user\` installed a C extension that required the Python shared library at runtime, but the alpine image's Python is compiled statically \(no .so file\). The fix was to switch to \`python:3.9-slim\` \(Debian-based, with shared libraries\), or to install the \`libpython3.9\` package in the alpine image. The engineer chose to use \`python:3.9-slim\` and changed the Dockerfile to use \`pip install .\` instead of \`--user\`, which also avoided permission issues.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-09-27T20:12:01.654785+00:00— report_created — created