THE WORKING REFERENCE APP
Read the implementation.
These files come directly from the backend codebase at build time. No running API or database is needed to browse them.
Dockerfile
FROM node:22-bookworm-slim AS build
WORKDIR /app
COPY package.json package-lock.json ./
COPY api/package.json api/package.json
COPY course/package.json course/package.json
RUN npm ci --workspace api --include-workspace-root --no-audit --no-fund
COPY api api
RUN npm run build --workspace api
RUN npm prune --omit=dev --workspace api --include-workspace-root=false --no-audit --no-fund
FROM node:22-bookworm-slim AS runtime
ENV NODE_ENV=production
WORKDIR /app/api
COPY --from=build --chown=node:node /app/node_modules /app/node_modules
COPY --from=build --chown=node:node /app/api/package.json ./package.json
COPY --from=build --chown=node:node /app/api/dist ./dist
COPY --from=build --chown=node:node /app/api/drizzle ./drizzle
COPY --from=build --chown=node:node /app/api/public ./public
USER node
EXPOSE 4000
CMD ["node", "dist/server.js"]