deploy: use multi-stage build since we need ts and prisma stuff

Pedro Lucas Porcellis porcellis@eletrotupi.com 5 days ago 74ae5f1274f034c64cdb19c5573e5c370571e697
Parents: 5a5529d
2 file(s) changed
  • api/Dockerfile.production +21 -8
  • api/package.json +1 -1
api/Dockerfile.production
@@ -1,4 +1,5 @@
1 - FROM node:24-alpine3.23 AS deps
1 + # Build stage
2 + FROM node:24-alpine3.23 AS builder
2 3
3 4 RUN apk add --no-cache build-base yaml-dev
4 5
@@ -8,16 +9,22 @@
8 9 USER ${UID}:${GID}
9 10 WORKDIR /app
10 11
12 + # Install all deps (including dev, which is needed for tsc, tsc-alias, prisma)
11 13 COPY --chown=${UID}:${GID} package*.json ./
12 - RUN npm ci --frozen-lockfile --omit=dev
14 + RUN npm ci --frozen-lockfile
13 15
14 16 COPY --chown=${UID}:${GID} prisma ./prisma/
15 17 RUN npx prisma generate
16 18
17 - # For runtime then:
19 + COPY --chown=${UID}:${GID} . .
20 +
21 + # Compile TS and spit on dist/
22 + RUN npm run build
23 +
24 + # Runtime stage
18 25 FROM node:24-alpine3.23
19 26
20 - RUN apk add --no-cache bash postgresql17-client valkey-cli
27 + RUN apk add --no-cache bash postgresql17-client valkey-cli yaml-dev
21 28
22 29 ARG UID=1000
23 30 ARG GID=1000
@@ -25,12 +32,18 @@
25 32 USER ${UID}:${GID}
26 33 WORKDIR /app
27 34
28 - COPY --from=deps --chown=${UID}:${GID} /app/node_modules ./node_modules
29 - COPY --from=deps --chown=${UID}:${GID} /app/node_modules/.prisma ./node_modules/.prisma
35 + # Only prod deps
36 + COPY --chown=${UID}:${GID} package*.json ./
37 + RUN npm ci --frozen-lockfile --omit=dev
30 38
31 - COPY --chown=${UID}:${GID} . .
39 + # Prisma client generated in builder
40 + COPY --from=builder --chown=${UID}:${GID} /app/node_modules/.prisma ./node_modules/.prisma
41 +
42 + # Compiled output and prisma schema (needed for migrate deploy)
43 + COPY --from=builder --chown=${UID}:${GID} /app/dist ./dist
44 + COPY --chown=${UID}:${GID} prisma ./prisma/
32 45
33 46 EXPOSE 3000
34 47
35 - # migrate then start — migrations are idempotent
48 + # migrate then start
36 49 CMD ["sh", "-c", "npx prisma migrate deploy && npm run prod"]
api/package.json
@@ -10,7 +10,7 @@ "test": "tests"
10 10 },
11 11 "scripts": {
12 12 "build": "tsc && tsc-alias",
13 - "prod": "node src/index.js",
13 + "prod": "node dist/index.js",
14 14 "start": "nodemon src/index.ts",
15 15 "test": "npm run test:setup && dotenv -e .env.test -o -- npx ava",
16 16 "test:setup": "npm run test:setup:generate && npm run test:setup:migrate",