# syntax=docker/dockerfile:1 # Build stage: the whole workspace is needed because apps/api imports the packages/* # source directly and tsup bundles it in. FROM node:22-slim AS build ENV PNPM_HOME=/pnpm PATH=/pnpm:$PATH RUN corepack enable WORKDIR /repo COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.base.json ./ COPY apps/api/package.json apps/api/ COPY apps/web/package.json apps/web/ COPY packages/contracts/package.json packages/contracts/ COPY packages/i18n/package.json packages/i18n/ COPY packages/rules/package.json packages/rules/ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile COPY packages packages COPY apps/api apps/api COPY docs docs RUN pnpm --filter @impuestos/api build RUN pnpm --filter @impuestos/api deploy --prod --legacy /prod/api FROM node:22-slim AS runtime ENV NODE_ENV=production WORKDIR /app # Owns ./data, the SQLite file and the local storage driver's files. RUN mkdir -p /app/data && chown -R node:node /app COPY --from=build --chown=node:node /prod/api/node_modules ./node_modules COPY --from=build --chown=node:node /repo/apps/api/dist ./dist COPY --from=build --chown=node:node /repo/apps/api/package.json ./package.json USER node EXPOSE 4000 # SIGTERM is handled in src/index.ts: fail readiness, drain, close the pool, exit 0. # No init shim, so node stays PID 1 and receives the signal directly. CMD ["node", "dist/index.js"]