|
| 1 | +# ───────────────────────────────────────────────────────────── |
| 2 | +# Devonz (bolt.diy) — Multi-stage Docker build |
| 3 | +# Optimised for pnpm + Remix on Node 20 LTS |
| 4 | +# ───────────────────────────────────────────────────────────── |
| 5 | + |
| 6 | +# ── Stage 1: base ───────────────────────────────────────────── |
| 7 | +# Shared base with corepack-managed pnpm |
| 8 | +FROM node:20-slim AS base |
| 9 | +ENV PNPM_HOME="/pnpm" |
| 10 | +ENV PATH="$PNPM_HOME:$PATH" |
| 11 | +RUN corepack enable && corepack prepare pnpm@9.14.4 --activate |
| 12 | +WORKDIR /app |
| 13 | + |
| 14 | +# ── Stage 2: deps ───────────────────────────────────────────── |
| 15 | +# Install ALL dependencies (dev + prod) for the build step |
| 16 | +FROM base AS deps |
| 17 | +COPY package.json pnpm-lock.yaml ./ |
| 18 | +RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ |
| 19 | + pnpm install --frozen-lockfile |
| 20 | + |
| 21 | +# ── Stage 3: build ──────────────────────────────────────────── |
| 22 | +# Build the Remix application |
| 23 | +FROM deps AS build |
| 24 | +COPY . . |
| 25 | + |
| 26 | +# Git info for pre-start.cjs (falls back to 'no-git-info' in Docker) |
| 27 | +RUN node pre-start.cjs |
| 28 | +RUN pnpm build |
| 29 | + |
| 30 | +# ── Stage 4: prod-deps ─────────────────────────────────────── |
| 31 | +# Prune to production deps only (remix-serve is now a prod dep) |
| 32 | +FROM build AS prod-deps |
| 33 | +RUN pnpm prune --prod --ignore-scripts |
| 34 | + |
| 35 | +# ── Stage 5: runtime ───────────────────────────────────────── |
| 36 | +# Minimal final image — only build output + prod deps |
| 37 | +FROM node:20-slim AS runtime |
| 38 | +ENV NODE_ENV="production" |
| 39 | +ENV PORT="5173" |
| 40 | +WORKDIR /app |
| 41 | + |
| 42 | +# git: needed by api.git-info.ts (execSync('git ...')) |
| 43 | +# curl: needed for healthchecks on some container platforms |
| 44 | +RUN apt-get update && apt-get install -y --no-install-recommends git curl \ |
| 45 | + && rm -rf /var/lib/apt/lists/* |
| 46 | + |
| 47 | +# Copy node_modules (includes remix-serve needed for runtime) |
| 48 | +COPY --from=prod-deps /app/node_modules ./node_modules |
| 49 | + |
| 50 | +# Copy build output |
| 51 | +COPY --from=build /app/build ./build |
| 52 | + |
| 53 | +# Copy package.json (needed by remix-serve) |
| 54 | +COPY --from=build /app/package.json ./ |
| 55 | + |
| 56 | +# Non-root user for security |
| 57 | +RUN groupadd --system --gid 1001 appgroup && \ |
| 58 | + useradd --system --uid 1001 --gid appgroup --create-home appuser && \ |
| 59 | + chown -R appuser:appgroup /app |
| 60 | +USER appuser |
| 61 | + |
| 62 | +EXPOSE 5173 |
| 63 | +CMD ["node", "node_modules/@remix-run/serve/dist/cli.js", "./build/server/index.js"] |
0 commit comments