eletrotupi / tcc/ commit / 74ae5f1

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

Pedro Lucas Porcellis porcellis@eletrotupi.com 1 month ago 74ae5f1274f034c64cdb19c5573e5c370571e697
Parents: 5a5529d
2 file(s) changed
  • api/Dockerfile.production +21 -8
  • api/package.json +1 -1
api/Dockerfile.production
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

5 6
ARG UID=1000
6 7
ARG GID=1000
7 8

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
24 31

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
1 1
{
2 2
  "name": "orbit-api",
3 3
  "version": "0.0.0",
4 4
  "description": "",
5 5
  "license": "ISC",
▸ 2 unchanged lines
8 8
  "directories": {
9 9
    "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",
17 17
    "test:setup:generate": "dotenv -e .env.test -o -- npx prisma generate",
18 18
    "test:setup:migrate": "dotenv -e .env.test -o -- npx prisma db push",
▸ 45 unchanged lines
64 64
    "tsconfig-paths": "^4.2.0",
65 65
    "tsx": "^4.21.0",
66 66
    "typescript": "^6.0.2"
67 67
  }
68 68
}