You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
--runtime bun scaffolds (#541) currently emit a Dockerfile with a node:24-alpine base plus a copied-in Bun binary, NOT a pure oven/bun:1 image. That workaround existed because a scaffolded app pins @webjsdev/cli: latest, and the boot-time webjs db migrate shelled npx drizzle-kit (no npx in a pure Bun image) until the npx-free CLI was published. @webjsdev/cli@0.10.20 (#570, runtime-native webjs db/test) is now the published latest, so a freshly scaffolded bun app resolves drizzle-kit and spawns it with the current runtime, no npx. The pure oven/bun:1 image is now safe and is the simpler, intended form.
Design / approach
Flip bunifyDockerfile back to the pure oven/bun:1 base (this is the original #541 design, deferred until the CLI shipped). The server already serves on Bun; with cli@0.10.20 the migrate runs under Bun without npx, so no Node toolchain is needed in the image.
DROP the bun-binary copy (COPY --from=oven/bun:1-alpine /usr/local/bin/bun /usr/local/bin/bun); it is the base now.
The node template's RUN apk add --no-cache ca-certificates is alpine-only; oven/bun:1 is Debian (no apk, ca-certs already present), so REMOVE that line in the bun transform (do not leave an apk call that breaks the Debian build).
Keep COPY package.json bun.lock* ./ + RUN bun install + trustedDependencies (better-sqlite3 glibc prebuild fetches on the Debian base) + CMD ["bun", "--bun", "run", "start"].
Switch the healthcheck node -e -> bun -e (a pure Bun image: prefer bun; it also has a node shim, but bun -e is the honest form).
Rewrite the top comment + the CMD/bun-binary comments to the pure-oven/bun rationale (cli@0.10.20 makes db/test npx-free, so no Node base needed).
Tests: test/scaffolds/scaffold-runtime.test.js (assert FROM oven/bun:1, NO COPY --from=oven/bun:1-alpine, CMD ["bun","--bun","run","start"]) and packages/cli/test/runtime-rewrite/runtime-rewrite.test.mjs (the bunifyDockerfile unit case: oven/bun base, no node:24-alpine, bun -e healthcheck). Counterfactual already implicit (assertions flip).
Docs: packages/cli/AGENTS.md (create-row + runtime-rewrite module entry -> pure oven/bun), docs/app/docs/getting-started/page.ts + docs/app/docs/deployment/page.ts (the scaffold now generates FROM oven/bun:1; the node-base+bun-binary becomes the "if you want a Node base" alternative). Root AGENTS.md scaffolding line.
Problem
--runtime bunscaffolds (#541) currently emit a Dockerfile with anode:24-alpinebase plus a copied-in Bun binary, NOT a pureoven/bun:1image. That workaround existed because a scaffolded app pins@webjsdev/cli: latest, and the boot-timewebjs db migrateshellednpx drizzle-kit(nonpxin a pure Bun image) until the npx-free CLI was published.@webjsdev/cli@0.10.20(#570, runtime-nativewebjs db/test) is now the publishedlatest, so a freshly scaffolded bun app resolves drizzle-kit and spawns it with the current runtime, nonpx. The pureoven/bun:1image is now safe and is the simpler, intended form.Design / approach
Flip
bunifyDockerfileback to the pureoven/bun:1base (this is the original #541 design, deferred until the CLI shipped). The server already serves on Bun; with cli@0.10.20 the migrate runs under Bun withoutnpx, so no Node toolchain is needed in the image.Implementation notes (for the implementing agent)
packages/cli/lib/runtime-rewrite.js,bunifyDockerfile().FROM node:24-alpine->FROM oven/bun:1.COPY --from=oven/bun:1-alpine /usr/local/bin/bun /usr/local/bin/bun); it is the base now.RUN apk add --no-cache ca-certificatesis alpine-only;oven/bun:1is Debian (noapk, ca-certs already present), so REMOVE that line in the bun transform (do not leave anapkcall that breaks the Debian build).COPY package.json bun.lock* ./+RUN bun install+trustedDependencies(better-sqlite3 glibc prebuild fetches on the Debian base) +CMD ["bun", "--bun", "run", "start"].node -e->bun -e(a pure Bun image: prefer bun; it also has a node shim, but bun -e is the honest form).latest; note that in the comment. Invariant 11 on all prose/comments.test/scaffolds/scaffold-runtime.test.js(assertFROM oven/bun:1, NOCOPY --from=oven/bun:1-alpine,CMD ["bun","--bun","run","start"]) andpackages/cli/test/runtime-rewrite/runtime-rewrite.test.mjs(the bunifyDockerfile unit case: oven/bun base, no node:24-alpine, bun -e healthcheck). Counterfactual already implicit (assertions flip).packages/cli/AGENTS.md(create-row + runtime-rewrite module entry -> pure oven/bun),docs/app/docs/getting-started/page.ts+docs/app/docs/deployment/page.ts(the scaffold now generatesFROM oven/bun:1; the node-base+bun-binary becomes the "if you want a Node base" alternative). RootAGENTS.mdscaffolding line.Acceptance criteria
--runtime bunscaffold emitsFROM oven/bun:1withbun install+CMD ["bun","--bun","run","start"]and NO node base / bun-binary copy /apkline.bun -e.