The five words every engineer dreads
"It works on my machine." The universal admission that environments diverge — and that hours just got burned chasing a bug that has nothing to do with your code.
The technical name for this is dependency hell: your app needs Python 3.12, staging has 3.10. Your node_modules install differently on macOS vs Linux. libssl and libpq versions drift across hosts. Every new hire spends two days getting their laptop to match production.
Why this is expensive
- Engineering time — the most expensive resource — leaks into reproducing setups instead of shipping features.
- Onboarding stretches from hours to days because there is no canonical environment.
- Deploy failures become normal: code that passed CI breaks in prod because the host's libc is different.
- Rollbacks are scary because you cannot perfectly recreate the previous environment.
What containers fix
A container packages your process, its filesystem assumptions, and its OS-level dependencies into a single artifact. The same artifact runs on your laptop, on CI, on staging, on production. Different host kernel? Same artifact. Different cloud? Same artifact. The image is the contract.
This is not just convenience — it is a shift in what counts as the deliverable. The deliverable is no longer "source code plus a wiki page about how to run it." It is the image.