# syntax=docker/dockerfile:1 # ---- deps: instala todas as dependências (inclui dev, precisa pra build) ---- FROM node:20-alpine AS deps # python3/make/g++: precisos para compilar o binding nativo do `argon2` # (não há prebuild musl/Alpine para todas as versões/arquiteturas). RUN apk add --no-cache openssl python3 make g++ WORKDIR /app COPY package*.json ./ COPY prisma ./prisma RUN npm ci RUN npx prisma generate # ---- dev: usado pelo docker-compose.override.yml, com hot-reload ---- FROM deps AS dev WORKDIR /app COPY . . CMD ["npm", "run", "dev"] # ---- build: compila TypeScript -> dist ---- FROM node:20-alpine AS build RUN apk add --no-cache openssl WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY --from=deps /app/prisma ./prisma COPY . . RUN npm run build # ---- prod-deps: reinstala só dependências de produção ---- FROM node:20-alpine AS prod-deps RUN apk add --no-cache openssl python3 make g++ WORKDIR /app COPY package*.json ./ COPY prisma ./prisma RUN npm ci --omit=dev RUN npx prisma generate # ---- production: imagem final enxuta ---- FROM node:20-alpine AS production RUN apk add --no-cache openssl WORKDIR /app ENV NODE_ENV=production COPY --from=prod-deps /app/node_modules ./node_modules COPY --from=build /app/dist ./dist COPY --from=build /app/prisma ./prisma COPY package*.json ./ EXPOSE 3000 CMD ["node", "dist/main"]