|
| 1 | +ARG NODE_VERSION=22.12.0 |
| 2 | +ARG PNPM_VERSION=9.15.2 |
| 3 | +ARG ALPINE_VERSION=3.21 |
| 4 | + |
| 5 | +# STAGE: Base |
| 6 | +FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS base |
| 7 | +WORKDIR /usr/local/app |
| 8 | +RUN --mount=type=cache,target=/root/.npm \ |
| 9 | + npm install -g pnpm@${PNPM_VERSION} |
| 10 | + |
| 11 | + |
| 12 | +######## CLIENT STAGES ######### |
| 13 | + |
| 14 | +# STAGE: CLIENT BASE |
| 15 | +FROM base AS client-base |
| 16 | +COPY web/package.json web/pnpm-lock.yaml web/favicon.ico web/index.html web/tsconfig.json web/tsconfig.node.json web/vercel.json web/vite.config.ts web/tailwind.config.js web/postcss.config.js ./ |
| 17 | +RUN --mount=type=cache,id=pnpm,target=/usr/local/share/.cache/pnpm \ |
| 18 | + pnpm install |
| 19 | +COPY web/public ./public |
| 20 | +COPY web/src ./src |
| 21 | + |
| 22 | + |
| 23 | +# STAGE: Client/Web Dev |
| 24 | +FROM client-base AS client-dev |
| 25 | +CMD ["pnpm", "dev"] |
| 26 | + |
| 27 | + |
| 28 | +# STAGE: Client production build |
| 29 | +FROM client-base AS client-build |
| 30 | +RUN pnpm build |
| 31 | + |
| 32 | + |
| 33 | +######## BACKEND STAGES ######### |
| 34 | + |
| 35 | +# STAGE: Backend base |
| 36 | +FROM base AS backend-base |
| 37 | +COPY api/package.json api/pnpm-lock.yaml ./ |
| 38 | +RUN --mount=type=cache,id=pnpm,target=/usr/local/share/.cache/pnpm \ |
| 39 | + pnpm install |
| 40 | +COPY api/node_modules ./node_modules |
| 41 | +COPY api/ . |
| 42 | + |
| 43 | + |
| 44 | +# STAGE: Backend Dev |
| 45 | +FROM backend-base AS backend-dev |
| 46 | +CMD ["pnpm", "dev"] |
| 47 | + |
| 48 | + |
| 49 | +# STAGE: Backend Test |
| 50 | +FROM backend-base AS backend-test |
| 51 | +CMD ["pnpm", "test"] |
| 52 | + |
| 53 | + |
| 54 | +# STAGE: Backend Build |
| 55 | +FROM backend-base AS backend-build |
| 56 | +RUN pnpm build |
| 57 | + |
| 58 | + |
| 59 | +# STAGE: Production |
| 60 | +FROM base AS production |
| 61 | +ENV NODE_ENV=production |
| 62 | +COPY --from=backend-build /usr/local/app/package.json /usr/local/app/pnpm-lock.yaml ./ |
| 63 | +RUN --mount=type=cache,id=pnpm,target=/usr/local/share/.cache/pnpm \ |
| 64 | + pnpm install --prod |
| 65 | +COPY --from=backend-build /usr/local/app/dist ./dist/api |
| 66 | +COPY --from=client-build /usr/local/app/dist ./dist/client |
| 67 | +EXPOSE 8000 |
| 68 | +CMD ["node", "dist/api/app.js"] |
0 commit comments