devpi is a private Python package index and caching proxy for PyPI.
flowchart LR
Dev([Developer]) -->|pip install| Devpi[devpi :3141]
Devpi -->|cache/proxy| PyPI[Public PyPI]
Devpi --> Storage[(./data)]
CI([CI/CD]) -->|pip install| Devpi
Dev -->|twine upload| Devpi
- devpi-server starts and serves package index APIs.
- You can mirror public PyPI packages and host private packages.
- Python clients install/publish packages through devpi endpoints.
- Package metadata and files persist in
./data.
- Image:
muccg/devpi:latest - Container name:
devpi - Endpoint:
http://<host-ip>:3141 - Persistent data:
./data:/data
Copy .env.example to .env:
DEVPI_PORT(default:3141)
cd devpi
cp .env.example .env
docker compose up -dPodman:
cd devpi
cp .env.example .env
podman compose up -dpip install devpi-clientdevpi use http://localhost:3141Default root password in this image is empty on first initialization, so login with:
devpi login root --password=''
devpi user -c myuser password=mysafepassword email=myuser@example.com
devpi login myuser --password=mysafepassword
devpi index -c dev bases=root/pypi volatile=False
devpi use myuser/devTemporary (single command):
pip install --index-url http://localhost:3141/myuser/dev/+simple/ requestsPersistent (pip config):
pip config set global.index-url http://localhost:3141/myuser/dev/+simple/Build your package:
python -m buildUpload with twine:
pip install twine
twine upload --repository-url http://localhost:3141/myuser/dev/ dist/*After upload, your package is stored in devpi and can be installed via pip from your index.
- Great for caching dependencies in CI/CD to speed builds.
- Add auth/users before production usage.