Secure, Distroless, Multi-Arch Node.js Runtime. Built from Scratch, 0 Vulnerabilities, <50MB.
10K+
Runtime Node is a production-grade Docker base image that ships only what Node.js actually needs to run — and nothing more. No shell. No package manager. No OS utilities. Just Node.js and the minimum set of components required to run it reliably in production.
Built with a FROM scratch runtime stage, the image is assembled by extracting only the required binaries and shared libraries from the official Alpine Node.js image instead of inheriting a full operating system. The result is a smaller, cleaner runtime image with a minimal attack surface.
Most Node.js Docker images ship with far more than your application needs at runtime. Shells, package managers, and system utilities do not help your app run — they just add extra surface area.
Runtime Node enforces a distroless runtime contract: if a component is not required to execute Node.js, it is not in the image. Every release is verified by automated integrity checks before publication.
| Feature | Detail |
|---|---|
| Base | FROM scratch — no OS userland, no shell |
| Current Main Line | Node.js 26.1.0 |
| Maintained Line | Node.js 24.15.0 and 25.9.0 |
NODE_ENV | production (baked in) |
TZ | UTC (baked in) |
| Timezone Database | IANA tzdata included |
| Image Size | <50 MiB |
| Architectures | linux/amd64, linux/arm64 |
| Shell | None |
| Package Manager | None |
| CA Certificates | Included |
| DNS Resolution | nsswitch.conf included |
| Provenance & SBOM | Generated on every release |
node:latest | node:alpine | runtimenode/runtime-node | |
|---|---|---|---|
| Approx. compressed amd64 size | ~388 MiB | ~57 MiB | <50 MiB |
| Base | Debian-based | Alpine Linux | FROM scratch |
| Shell | ✅ | ✅ | ❌ None |
| Package Manager | ✅ | ✅ | ❌ None |
| OS userland | Full | Minimal | None |
NODE_ENV=production preset | ❌ | ❌ | ✅ |
TZ=UTC preset | ❌ | ❌ | ✅ |
| Provenance & SBOM | ❌ | ❌ | ✅ |
Approximate compressed
linux/amd64sizes from the Docker Hub API on March 30, 2026.
# Docker Hub — latest
docker pull runtimenode/runtime-node:latest
# Docker Hub — versioned (recommended for production)
docker pull runtimenode/runtime-node:v<major>.<minor>.<patch>-node<node_version>
# GitHub Container Registry — latest
docker pull ghcr.io/runtimes-node/runtime-node:latest
# GitHub Container Registry — versioned (recommended for production)
docker pull ghcr.io/runtimes-node/runtime-node:v<major>.<minor>.<patch>-node<node_version>
For available tags, see the Tags tab or the Releases page on GitHub.
Docker registries normalize
+to-in tag names. The canonical GitHub release isv<major>.<minor>.<patch>+node<node_version>; the published registry tag isv<major>.<minor>.<patch>-node<node_version>.
# Build stage — match the current runtime line
FROM node:<node_version>-alpine3.23 AS builder
WORKDIR /dist
COPY ./ ./
RUN npm ci --omit=dev --no-cache
# Runtime stage — distroless, production-ready
FROM runtimenode/runtime-node:v<major>.<minor>.<patch>-node<node_version>
# Copy your production build artifacts only
COPY --from=builder --chown=1000:1000 --chmod=550 dist/ /app/
# Expose any port needed to run the JavaScript file, for example 5500
EXPOSE 5500
#Switch to non-root user inside a group
USER 1000:1000
# No shell is available — invoke Node directly using exec form
ENTRYPOINT ["/usr/local/bin/node", "/app/index.js"]
If you are targeting the Node.js 24 LTS line instead, pair node:24.<minor_node_version>.<patch_node_version>-alpine3.23 with runtimenode/runtime-node:v1.<minor>.<patch>-node24.<minor_node_version>.<patch_node_version>.
Because the image has no shell, your
ENTRYPOINTmust use exec form (JSON array syntax) and reference the Node.js binary by its absolute path:/usr/local/bin/node.
GitHub release tags follow the pattern v<major>.<minor>.<patch>+node<node_version>.
Published registry tags use the normalized form v<major>.<minor>.<patch>-node<node_version>.
Example:
v2.2.0+node25.9.0v2.2.0-node25.9.0The project semver is independent of Node.js semver. A Node.js major version bump triggers a major image bump. A Node.js minor or patch bump triggers a minor image bump. All other changes trigger a patch bump.
As of May 11, 2026:
| Line | Current GitHub Release | Current Registry Tag | Status |
|---|---|---|---|
v3.x.x+node26.x.x | v3.1.0+node26.1.0 | v3.1.0-node26.1.0 | Active — tracks latest |
v2.x.x+node25.x.x | v2.2.0+node25.9.0 | v2.2.0-node25.9.0 | Maintained |
v1.x.x+node24.x.x | v1.3.0+node24.15.0 | v1.3.0-node24.15.0 | Maintained |
latest tag currently points to the latest release.v3.x.x+node26.x.x line is the current main release linev2.x.x+node25.x.x line is the Node.js 25 maintenance line.v1.x.x+node24.x.x line is the Node.js 24 LTS maintenance line.For production deployments, always pin to a specific versioned registry tag rather than latest.
The final image contains only the components required for Node.js to operate correctly in production:
/usr/local/bin/node/etc/ssl/certs/usr/share/zoneinfo with TZ=UTC by defaultld-musl, libstdc++, libgcc_s/tmp with sticky-bit permissions (1777)nsswitch.conf at /etc/nsswitch.confBy design, the image does not include:
/bin/sh, /bin/bash, or any equivalentapk, apt, yum, or any equivalentcurl, wget, ps, ls, or any equivalentIf you need build tools or debugging utilities, use a separate builder stage. Do not expect to exec into this container — it has no shell to execute.
Two environment variables are baked into every image:
NODE_ENV=productionTZ=UTCThe timezone can still be overridden at runtime because the timezone database is included.
Every release is built for both linux/amd64 and linux/arm64 with provenance attestations and an SBOM. The same image tag works across both architectures — Docker automatically pulls the correct variant for your platform.
Runtime Node is built to minimize the attack surface at every layer:
FROM scratch baseTo report a vulnerability, use GitHub Security Advisories. Do not open a public GitHub issue for security reports. See SECURITY.md for the full disclosure process.
| Registry | Image |
|---|---|
| Docker Hub | runtimenode/runtime-node |
| GitHub Container Registry | ghcr.io/runtimes-node/runtime-node |
Runtime Node is licensed under the Apache License 2.0. See LICENSE for details.
Content type
Image
Digest
sha256:d60b2a4a7…
Size
52.6 MB
Last updated
3 months ago
docker pull runtimenode/runtime-node