Supported Runtimes
No Dockerfile needed. Pick a runtime, set a command, deploy.
PromptShip can build your app automatically from a supported runtime. Just tell it what language you're using and what command starts your app — no Docker knowledge required.
For full control (custom system packages, multi-stage builds, unsupported languages like Rust or Java), bring your own Dockerfile instead.
Need a runtime that's not listed? Let us know.
Available runtimes
| Runtime | Default Port | Auto-detected files |
|---|---|---|
python:3.12 |
8000 | requirements.txt or pyproject.toml |
python:3.11 |
8000 | requirements.txt or pyproject.toml |
node:22 |
3000 | package.json (uses npm ci if lockfile present, npm install otherwise) |
node:20 |
3000 | package.json |
go:1.22 |
8080 | go.mod (multi-stage build, compiles to distroless) |
go:1.21 |
8080 | go.mod |
bun:1 |
3000 | package.json |
static |
80 | Serves files via nginx. No build step. |
dockerfile |
8080 | Your own Dockerfile. See templates. |
How to use
Three steps: set the runtime, set the process command, deploy.
# 1. Set the runtime and port
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)
# 2. Set the web process command
configure_process(
app_name: "my-api",
process_name: "web",
process_type: "web",
command: "gunicorn app:app --bind 0.0.0.0:$PORT"
)
# 3. Deploy
deploy_app(app_name: "my-api", branch: "main")
Python
Works with requirements.txt or pyproject.toml. If both exist, requirements.txt takes precedence.
# Flask
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)
configure_process(app_name: "my-api", process_name: "web", process_type: "web",
command: "gunicorn app:app --bind 0.0.0.0:$PORT")
# FastAPI
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)
configure_process(app_name: "my-api", process_name: "web", process_type: "web",
command: "uvicorn app:main --host 0.0.0.0 --port $PORT")
# Django
configure_app(app_name: "my-api", runtime: "python:3.12", port: 8000)
configure_process(app_name: "my-api", process_name: "web", process_type: "web",
command: "gunicorn myproject.wsgi:application --bind 0.0.0.0:$PORT")
Workers & cron: Add background processes that share the same image and secrets:
configure_process(app_name: "my-api", process_name: "worker",
process_type: "worker", command: "celery -A app worker --loglevel=info")
configure_process(app_name: "my-api", process_name: "cleanup",
process_type: "cron", command: "python -m jobs.cleanup", cron_schedule: "0 2 * * *")
Node.js
Installs dependencies via npm ci (if package-lock.json exists) or npm install.
# Express / Fastify
configure_app(app_name: "my-app", runtime: "node:22", port: 3000)
configure_process(app_name: "my-app", process_name: "web", process_type: "web",
command: "node server.js")
# Next.js
configure_app(app_name: "my-app", runtime: "node:22", port: 3000)
configure_process(app_name: "my-app", process_name: "web", process_type: "web",
command: "npm start")
Make sure your app reads process.env.PORT:
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0');
Go
Multi-stage build: compiles in a Go image, copies the binary to a minimal distroless image. Your app must read PORT from the environment.
configure_app(app_name: "my-svc", runtime: "go:1.22", port: 8080)
configure_process(app_name: "my-svc", process_name: "web", process_type: "web",
command: "./server")
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.ListenAndServe(":"+port, router)
Bun
Installs dependencies via bun install --production.
configure_app(app_name: "my-app", runtime: "bun:1", port: 3000)
configure_process(app_name: "my-app", process_name: "web", process_type: "web",
command: "bun run server.ts")
Static Sites
Serves files with nginx. No build step needed.
configure_app(app_name: "my-site", runtime: "static")
configure_process(app_name: "my-site", process_name: "web", process_type: "web",
command: "nginx -g 'daemon off;'")
By default, nginx serves files from the repo root. To serve a subdirectory (e.g. dist/ after a build step), set root_dir:
configure_app(app_name: "my-site", runtime: "static", root_dir: "dist")
Need a build step? If your static site requires a build (e.g. npm run build → dist/), use the node:22 runtime or a custom Dockerfile.
When to use a Dockerfile instead
Supported runtimes cover the most common cases. Use a Dockerfile when you need:
- Custom system packages (e.g.
ffmpeg,imagemagick) - Multi-stage builds with a build step (e.g. Next.js standalone output)
- Languages not yet supported (Rust, Java, Elixir, etc.)
- Fine-grained control over the image layers
Set configure_app(runtime: "dockerfile") and place a Dockerfile in your repo.
Need a runtime that's not listed? Reach out and we'll add it.