Every modern PaaS asks the same question at deploy time: how do you want your source code turned into a container? On LaunchVerse there are two answers: write a Dockerfile, or let LaunchVerse Forge — our zero-config build engine — figure it out for you. They're both valid; they're best in different cases.
TL;DR
- Standard web app, common stack, no custom build steps? Let Forge auto-detect it. It recognises Node / Python / Ruby / Go / PHP / Java and produces an optimised image. Zero config.
- Specific OS dependencies, FFI, or custom build pipeline? Write a Dockerfile.
- Multiple services in one repo / monorepo / one-of-a-kind setup? Dockerfile per service, or Forge with explicit build overrides.
What each one is
Dockerfile
You write the recipe. LaunchVerse runs docker build. You have full control over base image, OS packages, build steps, runtime user, environment, and so on. The downside is you have to maintain it — security patches, base image upgrades, layer caching strategy.
Zero-config builds (LaunchVerse Forge)
Forge is LaunchVerse's own build engine. It inspects your repo, detects the framework (Next.js, Vite, Astro, SvelteKit, Express, FastAPI, Django, Flask, and more), and generates an optimised multi-stage container build — cached, accelerated, and patched by the platform.
Pros: zero config, base images kept patched automatically, aggressive build caching for fast redeploys. Cons: less control than a hand-written Dockerfile for exotic setups.
When Dockerfile is right
Reach for a Dockerfile if:
- You need OS packages that aren't in Forge's default images (
libsodium,wkhtmltopdf, etc.). - You're running native code that requires a specific compiler version.
- You have a complex multi-stage build (e.g. compile in a heavy image, copy artefacts to a slim runtime).
- You want a minimal final image (e.g. distroless) for security scanning.
- You have something unusual: ML model bundling, custom Java VM tuning, etc.
A Dockerfile is also the right move when you want builds to be portable across providers — every platform supports docker build.
When zero-config is right
Let Forge auto-detect if:
- You're shipping a standard web app in a popular language.
- You want the platform to keep your base image patched without you noticing.
- You don't have time / inclination to maintain a Dockerfile.
- Your build is "install dependencies, build, start" with no exotic steps.
This describes 80% of new web apps in 2026.
Performance
Build speed, in our (informal) benchmarks on Launchverse:
| Stack | Dockerfile (cold) | Forge (cold) | Forge (cached) |
|---|---|---|---|
| Node 20 + Next.js | 2m 40s | 2m 10s | 45s |
| Python 3.12 + FastAPI | 1m 20s | 1m 30s | 35s |
| Go 1.22 (small) | 50s | 1m 0s | 25s |
Cached rebuilds are where Forge shines — layer-aware caching and pre-warmed base images mean a typical redeploy skips straight to your app's build step.
When monorepos enter
A repo with a frontend, an API, and a worker is best handled with three separate "applications" inside a Launchverse project, each with its own build target. You can:
- Use a Dockerfile per app, with build context pointing at the relevant subdirectory.
- Use Forge per app with a root-directory override pointing at the app's subdirectory.
Avoid building one giant image that ships all three; deploy times balloon and a small UI tweak waits behind a slow worker rebuild.
Security tips
- Pin base image versions.
FROM node:20.11.1-alpinenotFROM node:latest. Your Dockerfile should produce the same image today as it does next month. - Run as non-root. Add
USER node(or a dedicated user) in production images. Forge-built images already do this. - Multi-stage builds. Compile in one stage, run in a slim final stage. Reduces attack surface and pulls < 100 MB on the wire.
- Scan. Trivy or Grype, run in CI. Most issues are out-of-date base images.