perf: ship a standalone slim Docker image (~590MB to ~283MB) (#841)

Enable Next `output: 'standalone'` and rewrite the Dockerfile to package only the traced standalone server + .next/static + public on node:20-slim (glibc, matching the runner), running `node server.js`. No in-image npm ci, no full source or dependency tree. Cuts the image ~52%, so docker push and the server pull get much faster.

Also fixes a latent entrypoint bug (${VAR:"none"} -> ${VAR:-"none"}) that busybox sh tolerated but Debian dash (node:20-slim /bin/sh) rejects, which would otherwise crash the container on boot.

Smoke-tested via isolated build + docker run: boots in 37ms, all routes 200, redirects still bundled (/slack-url -> 307), static + public assets served, DocSearch env-injection intact.
This commit is contained in:
Jack Carter
2026-07-09 16:51:17 +02:00
committed by GitHub
parent 76845ec77f
commit 44cab34f6f
4 changed files with 28 additions and 24 deletions
+4
View File
@@ -16,6 +16,10 @@ const withMDX = nextMDX({
/** @type {import('next').NextConfig} */
const nextConfig = {
// Emit a self-contained server (.next/standalone) with a traced, minimal
// node_modules, so the Docker image ships just the server + static assets
// instead of the full source and dependency tree.
output: 'standalone',
assetPrefix: undefined,
reactStrictMode: true,
pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'mdx'],