eletrotupi / tcc/ api/Dockerfile.productionc7abb1f398f8a1bc181dc8f1933a67881fa6b9d5
1.2 KB | 53 lines Raw
1
# Build stage
2
FROM node:24-alpine3.23 AS builder
3

4
RUN apk add --no-cache build-base yaml-dev
5

6
ARG UID=1000
7
ARG GID=1000
8

9
USER ${UID}:${GID}
10
WORKDIR /app
11

12
# Install all deps (including dev, which is needed for tsc, tsc-alias, prisma)
13
COPY --chown=${UID}:${GID} package*.json ./
14
RUN npm ci --frozen-lockfile
15

16
COPY --chown=${UID}:${GID} prisma ./prisma/
17
COPY --chown=${UID}:${GID} ./prisma.config.ts ./
18
RUN npx prisma generate
19

20
COPY --chown=${UID}:${GID} . .
21

22
# Compile TS and spit on dist/
23
RUN npm run build
24

25
RUN cp -r src/static dist/static
26

27
# Runtime stage
28
FROM node:24-alpine3.23
29

30
RUN apk add --no-cache bash postgresql17-client valkey-cli yaml-dev
31

32
ARG UID=1000
33
ARG GID=1000
34

35
USER ${UID}:${GID}
36
WORKDIR /app
37

38
# Only prod deps
39
COPY --chown=${UID}:${GID} package*.json ./
40
RUN npm ci --frozen-lockfile --omit=dev
41

42
# Prisma client generated in builder
43
COPY --from=builder --chown=${UID}:${GID} /app/node_modules/.prisma ./node_modules/.prisma
44

45
# Compiled output and prisma schema (needed for migrate deploy)
46
COPY --from=builder --chown=${UID}:${GID} /app/dist ./dist
47
COPY --chown=${UID}:${GID} prisma ./prisma/
48
COPY --chown=${UID}:${GID} prisma.config.ts ./
49

50
EXPOSE 3000
51

52
# migrate then start
53
CMD ["sh", "-c", "npx prisma migrate deploy && npm run prod"]