The go-to resource for upgrading Python, Django, Flask, and your dependencies.

Comparing Mise and Docker Python Images for Local Development Performance


Docker excels at providing reproducible Python environments—a key advantage for production deployments and CI/CD pipelines. During local development, however, we often encounter delays from image pulls, layer builds, and container startup. Mise provides an alternative approach. It installs Python versions natively on your host OS and uses lightweight shims controlled by a .tool-versions file in your project directory. In this article, we’ll review benchmarks comparing startup and full development cycles on Ubuntu 24.04 and Apple M2 Mac, then walk through migration steps from a Docker Compose setup.

Trade-offs: Docker vs Mise for Local Python Development

Docker provides strong reproducibility and isolation, which serve us well in production and CI/CD. Locally, though, image pulls, builds, and container overhead can slow our edit-run-test loops.

Common Docker costs for local work include:

  • Image pulls and builds, such as docker pull python:3.12-slim, taking 30-60s on first use or cache miss; rebuilds invalidate caches.
  • Container spin-up with volume mounts: typically 2-5s.
  • Ongoing resource use from the daemon and containers.

Mise mitigates these through native host installations:

  • Shims launch binaries in milliseconds—no container startup.
  • .tool-versions enables per-project versioning, auto-activated on directory change.
  • No daemon overhead; just the tools themselves.

Mise, however, offers less isolation than Docker. You rely on host OS compatibility, and project dependencies might conflict without container boundaries. Docker better matches production environments exactly.

Benchmarks: Docker vs Mise on Ubuntu 24.04 & M2 Mac

We ran these benchmarks with hyperfine, averaging 10 iterations each. Tests simulate cold starts (no prior cache for Docker) on specific hardware and average network. Your results will vary with caching, hardware, and connection speed.

Startup Time (Cold → python —version)

PlatformDocker (s)Mise (ms)Speedup
Ubuntu 24.043.20.93500x
M2 Mac4.10.75800x

Full Cycle: Install Deps + Run Script

PlatformDocker (s)Mise (s)Speedup
Ubuntu 24.04454.210.7x
M2 Mac523.813.7x

After the initial Mise setup, you avoid Docker’s repeat pulls. Cached Docker runs would narrow the gap.

Prerequisites

  • Mise installed following the official guide.
  • Docker Compose/Dockerfile using Python images.
  • Backup docker-compose.yml/Dockerfiles.

Step 1: Install Project Python Versions with Mise

We’ll set a per-project version first, as it overrides globals. Mise downloads and installs if needed.

$ cd myproject
$ echo "python 3.13.0" > .tool-versions
$ mise install

Mise now adjusts your PATH shims on cd into the directory.

Verify:

$ python --version
Python 3.13.0

(Optional global:)

$ mise use --global python@3.12.7

Step 2: Update Docker Compose—Remove Python App Service

Run your app natively now. Keep other services (DB, cache) in Docker for hybrid setup.

Edit docker-compose.yml:

# Remove or comment out:
# services:
#   app:
#     image: python:3.12-slim
#     volumes: ['./:/app']

Start supporting services:

$ docker compose up db redis  # adjust services as needed

Define dev task in mise.toml (like npm scripts, but shell):

[tasks.dev]
run = "python app.py"

Run with mise run dev instead of docker compose up app.

Step 3: Install Dependencies and Migrate Data

Use the shimmmed pip:

$ pip install -r requirements.txt

For persistent data (e.g., DB dumps from Docker volumes), copy to local directories.

In VS Code or PyCharm, select the Mise Python as interpreter:

$ which python
/home/user/.local/share/mise/installs/python/3.13.0/bin/python  # example path

Step 4: Verify and Benchmark Locally

Compare startup:

$ hyperfine --warmup 3 'docker run --rm python:3.12-slim python --version' 'python --version'

You should see Mise significantly faster. Run your full edit-run-test cycle to confirm end-to-end gains.

Troubleshooting

  • PATH Issues: mise doctor; eval "$(mise activate bash)".
  • Multi-Service: Use docker compose up db + local Python.
  • CI Parity: Use Mise in CI for consistency, or Docker to match production environments.
  • Windows: Install via WSL2 (Ubuntu); see Mise docs for shell integration.

Wrapping Up

Mise can accelerate your local Python development cycles by eliminating container overhead, with .tool-versions providing reproducible setups via Git. Docker remains ideal for scenarios demanding strict isolation or production fidelity.

Test the benchmarks in your own environment to weigh the trade-offs. For multi-language projects, Mise’s support beyond Python adds further value.


Tested March 2026 on Ubuntu 24.04/M2 macOS 15. Benchmarks approximate; test locally.

Sponsored by Durable Programming

Need help maintaining or upgrading your Python application? Durable Programming specializes in keeping Python apps secure, performant, and up-to-date.

Hire Durable Programming