Convenience images for running Node.js Circle CI builds
List of image tags:
| Tag | Based on | Description |
|---|---|---|
| 24 | cimg/node:24.14 | Node.js 24.14, pnpm (Corepack), Bun, Kiota, gettext-base. Supports buildx used by aws-ecr orb. |
| 26 | cimg/node:26.4 | Node.js 26.4, pnpm/yarn (preinstalled — no Corepack), Bun, Kiota, gettext-base. Supports buildx used by aws-ecr orb. |
Both tools are installed on PATH for the default circleci user (CircleCI’s Node image convention).
- How (tag 24): Corepack is enabled with
--install-directory ~/bin(i.e./home/circleci/binon this image). - Why that directory: Image layers run as
circleci, not root. A plaincorepack enablewants to write shims under/usr/local/bin, which is root-owned, so enabling Corepack forpnpm/yarninto~/binavoids permission errors without relying onsudoin that step. - How (tag 26+): Node.js dropped Corepack from the runtime starting with v25, so
cimg/node:26.xshipspnpmandyarnpreinstalled globally under/usr/local/bininstead — there is no Corepack step to run. - What you run:
pnpm/pnpxfrom the pruned monorepo as usual. On tag 24, version follows Corepack’s resolution (seepackageManagerin your repo); on tag 26+, version follows whatevercimg/nodebundles.
- How: Official Bun install with
BUN_INSTALL=/usr/local/bun; the directory is created andchown’d tocircleciso the runtime can live under a fixed/usr/local/...path while still being writable by the job user. - Why not
~/bin: Keeps Bun separate from Corepack’s shims in~/bin, avoids name clashes, and gives one obvious prefix (/usr/local/bun) for the binary and caches. - What you run: e.g.
bun ./scripts/ci-task.tswithouttscornode --experimental-strip-types. Pin isBUN_VERSIONin each version directory'sDockerfile(Renovate:oven-sh/bun).
Bun does not replace pnpm for installing workspace dependencies unless your pipeline calls bun explicitly.