Render Docker Deployments
Render uses BuildKit for Docker builds. All compute service types that support custom runtimes can use runtime: docker (build from a Dockerfile in the repo) or runtime: image (pull a prebuilt image; no Dockerfile build on Render). Deeper patterns and copy-paste templates live under references/.
When to Use
- Authoring or debugging a Dockerfile for a Render service
- Choosing
runtime: docker vs runtime: image in a Blueprint
- Wiring private base images or prebuilt images with registry credentials
- Multi-stage builds, build args, secrets, and layer caching
- Performance and security hardening of container images on Render
For full Blueprint authoring, see render-blueprints. For end-to-end deploy flows, see render-deploy.
Render Docker Builds
- BuildKit is used for Docker builds on Render.
runtime: docker: Render builds an image from your repo using dockerfilePath, dockerContext, and optional dockerCommand (overrides image CMD).
runtime: image: Render pulls image.url; no repo-based image build. Set image.creds.fromRegistryCreds.name when the registry is private.
Blueprint Configuration
| Field |
Role |
dockerfilePath |
Path to the Dockerfile (default ./Dockerfile) |
dockerContext |
Build context directory (what is sent to the daemon) |
dockerCommand |
Overrides the container CMD after the image is built |
image.url |
Image reference for runtime: image (registry/repo:tag or digest) |
image.creds |
Dashboard-stored credential reference for a private prebuilt image |
registryCredential |
Dashboard-stored credential reference for private base images used by runtime: docker |
Example sketch (values illustrative):
services:
- type: web
name: api
runtime: docker
region: oregon
plan: starter
dockerfilePath: ./Dockerfile
dockerContext: .
dockerCommand: node server.js
envVars:
- key: PORT
value: 10000
For runtime: image, set image.url and, if needed, image.creds per Registry Configuration below.
Multi-Stage Builds
Recommended for production. Use a builder stage for compilation and dependency installation, and a minimal runner stage that only copies artifacts and runtime files. Benefits:
- Smaller images and faster pulls
- Fewer tools and secrets in the final image (smaller attack surface)
- Clear separation between build-time and run-time dependencies
See references/dockerfile-patterns.md for language-specific templates.
Build Args vs Secrets
Critical: Never pass secrets via ARG. Build arguments are stored in image layers and can be recovered from the image history or intermediate layers.
- Prefer runtime environment variables (Render env vars / secret files) for application secrets.
- For build-time secrets (e.g. private package feeds), use Docker BuildKit secret mounts (
RUN --mount=type=secret,...) rather than ARG.
Treat anything sensitive as runtime or BuildKit secret mount, not as a build arg.
Registry Configuration
Private base images (for runtime: docker) or prebuilt images (runtime: image) need authentication:
- Store credentials in the Render Dashboard under Registry Credentials.
- For
runtime: docker, reference private base-image credentials with registryCredential.fromRegistryCreds.name.
- For
runtime: image, reference private prebuilt-image credentials with image.creds.fromRegistryCreds.name.
Supports common registries (Docker Hub, GHCR, ECR, Google Artifact Registry, and others). Step-by-step per provider: references/registry-setup.md.
Prebuilt image services do not auto-deploy when the tag moves in the registry; trigger a manual redeploy or use a deploy hook when you publish a new image.
Layer Caching
- Render caches Docker layers between builds; order Dockerfile instructions so that frequently unchanged layers stay early (see
references/optimization-guide.md).
- Tags and caching: mutable tags like
latest can resolve to stale cached images. Prefer immutable references: digest (repo/image@sha256:...) or version pins (v1.2.3).
Platform Specifics
- Render builds linux/amd64. Avoid assumptions about other architectures in production images.
- Port binding matches native services: bind HTTP to
0.0.0.0:$PORT (Render sets PORT).
- Health checks behave like non-Docker web services (
healthCheckPath, etc.).
- Secret files from Render appear under
/etc/secrets/ — do not rely on repo-root secret paths inside the container unless you copy or mount them explicitly in the image.
.dockerignore and Start Commands
- Always maintain a
.dockerignore that excludes node_modules, .git, .env, build artifacts, logs, and OS junk. This shrinks context upload time and avoids leaking local files into layers. Lists and rationale: references/optimization-guide.md.
- Custom start command: if you need multiple shell steps, use a single shell form, e.g.
/bin/sh -c 'set -e; ./migrate && exec node server.js' (prefer exec so your app receives signals for graceful shutdown).
References
| Document |
Contents |
references/dockerfile-patterns.md |
Multi-stage templates (Node, Python, Go, Ruby, Rust, static sites) |
references/registry-setup.md |
Docker Hub, GHCR, ECR, Artifact Registry + Blueprint wiring |
references/optimization-guide.md |
Layer order, .dockerignore, BuildKit cache mounts, debugging |
Related Skills
- render-deploy — Deploy flows, Blueprint vs Dashboard, operational steps
- render-blueprints — Full
render.yaml schema, wiring, and validation
- render-web-services — Web service behavior, health checks, and HTTP edge cases
1---2name: render-docker3description: Builds and deploys Docker containers on Render—Dockerfiles, multi-stage builds, Blueprint Docker fields, private registries, layer caching, and platform constraints. Use when the user mentions Docker, Dockerfile, container images, multi-stage builds, container registry, GHCR, ECR, BuildKit, dockerContext, runtime docker or image, or optimizing Docker builds on Render.4license: MIT5---6
7# Render Docker Deployments
8
9Render uses **BuildKit** for Docker builds. All compute service types that support custom runtimes can use **`runtime: docker`** (build from a Dockerfile in the repo) or **`runtime: image`** (pull a prebuilt image; no Dockerfile build on Render). Deeper patterns and copy-paste templates live under `references/`.
10
11## When to Use
12
13- Authoring or debugging a **Dockerfile** for a Render service
14- Choosing **`runtime: docker`** vs **`runtime: image`** in a Blueprint
15- Wiring **private base images** or **prebuilt images** with registry credentials
16- **Multi-stage builds**, **build args**, **secrets**, and **layer caching**
17- **Performance** and **security** hardening of container images on Render
18
19For full Blueprint authoring, see **render-blueprints**. For end-to-end deploy flows, see **render-deploy**.
20
21## Render Docker Builds
22
23- **BuildKit** is used for Docker builds on Render.
24- **`runtime: docker`**: Render builds an image from your repo using `dockerfilePath`, `dockerContext`, and optional `dockerCommand` (overrides image `CMD`).
25- **`runtime: image`**: Render pulls **`image.url`**; no repo-based image build. Set **`image.creds.fromRegistryCreds.name`** when the registry is private.
26
27## Blueprint Configuration
28
29| Field | Role |
30|-------|------|
31| `dockerfilePath` | Path to the Dockerfile (default `./Dockerfile`) |
32| `dockerContext` | Build context directory (what is sent to the daemon) |
33| `dockerCommand` | Overrides the container `CMD` after the image is built |
34| `image.url` | Image reference for `runtime: image` (registry/repo:tag or digest) |
35| `image.creds` | Dashboard-stored credential reference for a private prebuilt image |
36| `registryCredential` | Dashboard-stored credential reference for private base images used by `runtime: docker` |
37
38Example sketch (values illustrative):
39
40```yaml
41services:
42 - type: web
43 name: api
44 runtime: docker
45 region: oregon
46 plan: starter
47 dockerfilePath: ./Dockerfile
48 dockerContext: .
49 dockerCommand: node server.js
50 envVars:
51 - key: PORT
52 value: 10000
53```
54
55For `runtime: image`, set `image.url` and, if needed, `image.creds` per **Registry Configuration** below.
56
57## Multi-Stage Builds
58
59**Recommended for production.** Use a **builder** stage for compilation and dependency installation, and a minimal **runner** stage that only copies artifacts and runtime files. Benefits:
60
61- Smaller images and faster pulls
62- Fewer tools and secrets in the final image (smaller attack surface)
63- Clear separation between build-time and run-time dependencies
64
65See `references/dockerfile-patterns.md` for language-specific templates.
66
67## Build Args vs Secrets
68
69**Critical:** **Never pass secrets via `ARG`.** Build arguments are stored in image **layers** and can be recovered from the image history or intermediate layers.
70
71- Prefer **runtime environment variables** (Render **env vars** / secret files) for application secrets.
72- For **build-time** secrets (e.g. private package feeds), use **Docker BuildKit secret mounts** (`RUN --mount=type=secret,...`) rather than `ARG`.
73
74Treat anything sensitive as **runtime** or **BuildKit secret mount**, not as a build arg.
75
76## Registry Configuration
77
78Private **base images** (for `runtime: docker`) or **prebuilt images** (`runtime: image`) need authentication:
79
80- Store credentials in the Render Dashboard under **Registry Credentials**.
81- For `runtime: docker`, reference private base-image credentials with **`registryCredential.fromRegistryCreds.name`**.
82- For `runtime: image`, reference private prebuilt-image credentials with **`image.creds.fromRegistryCreds.name`**.
83
84Supports common registries (Docker Hub, GHCR, ECR, Google Artifact Registry, and others). Step-by-step per provider: `references/registry-setup.md`.
85
86**Prebuilt image services** do **not** auto-deploy when the tag moves in the registry; trigger a **manual redeploy** or use a **deploy hook** when you publish a new image.
87
88## Layer Caching
89
90- Render **caches Docker layers** between builds; **order Dockerfile instructions** so that frequently unchanged layers stay early (see `references/optimization-guide.md`).
91- **Tags and caching:** mutable tags like **`latest`** can resolve to **stale cached** images. Prefer **immutable** references: **digest** (`repo/image@sha256:...`) or **version pins** (`v1.2.3`).
92
93## Platform Specifics
94
95- Render builds **linux/amd64**. Avoid assumptions about other architectures in production images.
96- **Port binding** matches native services: bind HTTP to **`0.0.0.0:$PORT`** (Render sets `PORT`).
97- **Health checks** behave like non-Docker web services (`healthCheckPath`, etc.).
98- **Secret files** from Render appear under **`/etc/secrets/`** — do not rely on repo-root secret paths inside the container unless you copy or mount them explicitly in the image.
99
100## `.dockerignore` and Start Commands
101
102- Always maintain a **`.dockerignore`** that excludes **`node_modules`**, **`.git`**, **`.env`**, build artifacts, logs, and OS junk. This shrinks context upload time and avoids leaking local files into layers. Lists and rationale: `references/optimization-guide.md`.
103- **Custom start command:** if you need multiple shell steps, use a single shell form, e.g. **`/bin/sh -c 'set -e; ./migrate && exec node server.js'`** (prefer **`exec`** so your app receives signals for graceful shutdown).
104
105## References
106
107| Document | Contents |
108|----------|----------|
109| `references/dockerfile-patterns.md` | Multi-stage templates (Node, Python, Go, Ruby, Rust, static sites) |
110| `references/registry-setup.md` | Docker Hub, GHCR, ECR, Artifact Registry + Blueprint wiring |
111| `references/optimization-guide.md` | Layer order, `.dockerignore`, BuildKit cache mounts, debugging |
112
113## Related Skills
114
115- **render-deploy** — Deploy flows, Blueprint vs Dashboard, operational steps
116- **render-blueprints** — Full `render.yaml` schema, wiring, and validation
117- **render-web-services** — Web service behavior, health checks, and HTTP edge cases