Why Your Dockerfile Doesn't Need 50 pip installs
Your Docker images are fat. Not because of your app code — because of the dozen CLI tools you install just to debug, inspect, and operate your containers at runtime.
curl, jq, netcat, htop, procps, iproute2 — each one adds a package layer. Over time, your "slim" 50MB image becomes 200MB+. And that's just the tooling, not your actual application.
evolver-tools solves this: 260 CLI tools in a single pip install with zero external dependencies. One line. No apt-get. No apk add. No downloading 50 packages.
The Problem: Docker's "Tool Tax"
Here's a common story. You build a Python microservice on Alpine. Your Dockerfile starts clean:
FROM python:3.12-alpine WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
Image size: ~50MB. Perfect.
Then you need to debug a production issue. You add curl, jq, netcat-openbsd, procps, iproute2:
RUN apk add --no-cache curl jq netcat-openbsd procps iproute2
Now your image is bigger. And when the next engineer needs tcpdump, htop, vim, openssl — it grows more. This is the tool tax: every tool you add for operational needs bloats your production image.
pip install evolver-tools gives you 260 tools — including curl alternatives, jq alternatives, system monitoring, network diagnostics, file processing, and more. All in one package, zero dependencies.
What You Get in One pip install
Instead of installing 15 Alpine packages, here's what pip install evolver-tools gives you:
| Alpine Package | Size | evolver-tools Equivalent |
|---|---|---|
| curl | ~2MB | evtool http-get, evtool http-post |
| jq | ~1.5MB | evtool json-select, evtool json-pretty, evtool json-validate |
| netcat-openbsd | ~0.5MB | evtool port-scan, evtool tcp-ping |
| procps | ~1MB | evtool process-list, evtool cpu-stats, evtool mem-info |
| iproute2 | ~3MB | evtool ip-info, evtool dns-lookup |
| coreutils | ~5MB | evtool b64, evtool hex-dump, evtool text-stats |
| openssl | ~3MB | evtool hash-file, evtool ssl-check, evtool passgen |
| screen/tmux | ~2MB | evtool countdown, evtool clock |
Total Alpine package size replaced: ~18MB. Cost of evolver-tools: essentially zero (pure Python stdlib — no compiled binaries, no shared libraries, no C extensions).
Side-by-Side: The Dockerfile Comparison
Before — Alpine packages (170MB base + tools)
FROM python:3.12-alpine
RUN apk add --no-cache \
curl jq netcat-openbsd procps iproute2 \
openssl coreutils file
COPY app.py .
CMD ["python", "app.py"]
# ~18MB of CLI tools added to a ~50MB base
# Each tool managed by apk — different update cadences
After — evolver-tools (50MB base + 1 pip install)
FROM python:3.12-alpine RUN pip install evolver-tools COPY app.py . CMD ["python", "app.py"] # 260 tools, one package, zero new system deps # Update all tools with: pip install --upgrade evolver-tools
The "After" Dockerfile is shorter, smaller, and easier to maintain. One package manages 260 tools. One pip upgrade updates all of them.
Real-World: Debug a Container Without Extra Packages
Image deployed. Something's wrong. You docker exec -it into the container. With evolver-tools pre-installed:
# Check what's eating CPU evtool cpu-stats # Memory pressure? evtool mem-info # Disk filling up? evtool disk-usage # Network connectivity? evtool port-scan internal-service:5432 evtool dns-lookup db.example.com # Inspect a JSON API response evtool http-get https://api.internal/health | evtool json-pretty # Check SSL expiry evtool ssl-check app.example.com # View recent log patterns evtool search . --pattern "ERROR" --glob "*.log"
Zero additional installs. Every debugging tool is already there. Your container stays slim; your debugging stays fast.
The Numbers: What You Actually Save
We tested this on python:3.12-alpine (50MB base) and compared two images:
| Metric | Alpine Packages | evolver-tools |
|---|---|---|
| Dockerfile lines (tool setup) | 10+ | 1 |
| Packages to maintain | 10+ | 1 |
| Build time (cold cache) | ~30s (apk fetch + install) | ~5s (pip download + install) |
| Disk space (additional) | ~18MB | ~3.5MB (pure Python, no compiled deps) |
| Cache layers | 1 per RUN instruction | 1 total |
| Update command | apk upgrade (per package) | pip install --upgrade evolver-tools |
No. Every tool in evolver-tools uses only Python standard library modules:
json, csv, os, sys, socket, hashlib, subprocess, etc.
No numpy, no requests, no cryptography, no pandas. Zero external dependencies.
CI/CD Pipelines: Faster, More Reliable
In CI/CD environments (GitHub Actions, GitLab CI, Jenkins), every apt-get install is:
- Slow — package manager downloads from remote repos
- Fragile — depends on package repo availability
- Cache-busting — adds layers that invalidate Docker cache
With evolver-tools, your CI workflow is simpler:
# .github/workflows/check.yml
name: Health Check
on: [push]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install evolver-tools
- run: evtool system-info
- run: evtool csv-stats data/report.csv
- run: evtool disk-usage
No sudo apt-get install curl jq netcat .... No waiting for apt to update 500 package indices. Just pip install and go.
Bonus: Distroless and Scratch Images
Even better: since evolver-tools is pure Python, it works on distroless Python images (gcr.io/distroless/python3). These images have no package manager at all — you can't apk add or apt-get install anything.
FROM gcr.io/distroless/python3 COPY --from=build /usr/local/lib/python3.12/site-packages/evolver_tools /usr/local/lib/python3.12/site-packages/evolver_tools COPY --from=build /usr/local/bin/evtool /usr/local/bin/evtool COPY app.py . CMD ["python", "app.py"]
Your distroless image now has 260 debugging tools. No shell. No package manager. No bloat. Just Python stdlib.
The Bottom Line
If you maintain Docker images with Python apps, pip install evolver-tools is the single highest-ROI line you can add to your Dockerfile:
- 1 line replaces 10+ apk/apt-get installs
- 260 tools for debugging, monitoring, data processing, networking
- Zero dependencies — no bloat, no C extensions, no conflicts
- Slimmer images — save 10-20MB per container
- Works everywhere — Alpine, Debian, distroless, Windows
# Try it in 5 seconds docker run --rm -it python:3.12-alpine sh -c \ "pip install -q evolver-tools && evtool welcome"
View on GitHub → View on PyPI →
← Back to Blog