Choosing Between Docker Images and Buildpacks on Scalingo
Decide whether to deploy a pre‑built Docker image or use Scalingo’s buildpacks by comparing build time, runtime flexibility, cold‑start latency, and storage usage, then follow the concrete steps to deploy and verify.
17 May 2026, 00:29 UTC

Decision and constraints
When deploying an application on Scalingo you can either push a pre‑built Docker image or let Scalingo’s buildpacks compile the source at deploy time. The decision hinges on build time, runtime flexibility, cold‑start latency, and storage usage, while respecting the platform’s 2 GB container size limit.
Comparison of deployment options
| Aspect | Docker image | Buildpack |
|---|---|---|
| Build time | Performed in CI; no platform build minutes | Executed on Scalingo; consumes build minutes |
| Runtime flexibility | Fixed environment; requires rebuilding for changes | Environment recreated each deploy; picks up dependency updates automatically |
| Cold‑start latency | Can pre‑warm processes; lower latency for latency‑sensitive workloads | Depends on buildpack start‑up; may be higher |
| Storage usage | Image layers stored; can increase platform storage | Reuses cached layers; typically lower storage footprint |
| Size limit | Maximum 2 GB; larger images are rejected | Same limit applies to the resulting slug |
Trade‑offs
If your pipeline already builds and pushes Docker images, using that method eliminates Scalingo build minutes and guarantees that the exact image tested in CI runs in production. The downside is the need to manage image size and to rebuild whenever a dependency or base image changes.
Buildpacks are attractive for rapid prototyping or polyglot repositories because Scalingo detects the language, installs dependencies, and creates a slug. This adds latency to each deploy and consumes build minutes, but it reduces the operational burden of image maintenance and often results in a smaller stored artifact.
Concrete implementation: Docker image deployment
- Prerequisites: Scalingo CLI installed, logged in (
scalingo login), and you have theOwnerorAdminrole on the target app. - Build and tag your image locally, for example:
docker build -t registry.scalingo.com/<APP_NAME>:<TAG> . - Push the image to Scalingo’s registry:
docker push registry.scalingo.com/<APP_NAME>:<TAG>If the image exceeds 2 GB, the push will be rejected with an error about the size limit.
- Release the image to the app:
scalingo --app <APP_NAME> docker:deploy registry.scalingo.com/<APP_NAME>:<TAG>
Concrete implementation: Buildpack deployment
- Prerequisites: Same CLI access as above.
- Ensure your repository contains a recognizable language (e.g., a
package.jsonfor Node,requirements.txtfor Python) so Scalingo can select the correct buildpack. - Push the source:
git push scalingo mainScalingo will run the buildpack, create a slug, and start a dyno.
Validation and verification
After either deployment method, confirm that the container is running:
- List dynos:
scalingo --app <APP_NAME> ps. Look for aweb.1entry with stateup. - Inspect start‑up logs for errors:
scalingo --app <APP_NAME> logs. Successful start‑up typically ends with a line indicating the process is listening on the assigned port.
Practical check: send an HTTP request to the app’s URL (shown by scalingo --app <APP_NAME> domains) and verify a 200 response.
Limitations
- Docker images larger than 2 GB cannot be pushed; you must slim the image (multi‑stage builds, .dockerignore) before deployment.
- Buildpack deploys incur variable build minutes cost; monitor usage in the Scalingo dashboard if cost is a concern.
- Cold‑start advantages of pre‑warmed Docker images apply only if you configure the app to keep at least one dyno idle (e.g., via
scalingo --app <APP_NAME> scale web=1).
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.