# Use the official Bun image (runtime stays Bun; only install moves to pnpm) FROM oven/bun:1-alpine AS base WORKDIR /app # Install dependencies with pnpm. # - git: the @ng-eventually/client polyfill is a git+https (public Gitea) dependency → no auth. # - nodejs + npm: pnpm is a Node CLI; we pin the exact pnpm version via `npm i -g` # (Alpine's nodejs package does not bundle corepack). # The `bun` npm peer (pulled by bun-plugin-tailwind) is approved to build in package.json # (pnpm.onlyBuiltDependencies) so node_modules/.bin/bun is a real binary — required because # `bun run start` puts node_modules/.bin ahead of PATH. FROM base AS install RUN apk add --no-cache git nodejs npm \ && npm install -g pnpm@10.26.0 COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile # Copy source code and build assets FROM base AS release COPY --from=install /app/node_modules node_modules COPY . . # Run the app ENV NODE_ENV=production USER bun EXPOSE 3000/tcp ENTRYPOINT [ "bun", "run", "start" ]