# ============================================ # Stage 1: Dependencies # ============================================ FROM node:24-bookworm-slim AS dependencies WORKDIR /app COPY package*.json ./ RUN npm ci --only=production --ignore-scripts && \ npm cache clean --force # ============================================ # Stage 2: Builder # ============================================ FROM node:24-bookworm-slim AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --ignore-scripts && \ npm cache clean --force COPY . . RUN npm run build # ============================================ # Stage 3: Oracle Instant Client # ============================================ FROM node:24-bookworm-slim AS oracle-client RUN apt-get update && \ apt-get install -y --no-install-recommends \ libaio1 \ wget \ unzip \ ca-certificates && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /opt/oracle && \ wget --progress=dot:giga \ https://download.oracle.com/otn_software/linux/instantclient/2360000/instantclient-basic-linux.x64-23.6.0.24.10.zip \ -O /tmp/instantclient.zip && \ unzip -q /tmp/instantclient.zip -d /opt/oracle && \ rm /tmp/instantclient.zip && \ mv /opt/oracle/instantclient_* /opt/oracle/instantclient # ============================================ # Stage 4: Production # ============================================ FROM node:24-bookworm-slim AS production LABEL maintainer="Joelson" LABEL description="API Controle SaĆ­da Loja - NestJS + Oracle" LABEL version="1.0" RUN apt-get update && \ apt-get install -y --no-install-recommends \ libaio1 \ dumb-init && \ rm -rf /var/lib/apt/lists/* && \ apt-get clean RUN groupadd -r nodejs && \ useradd -r -g nodejs -s /bin/bash -d /home/nodejs nodejs && \ mkdir -p /home/nodejs && \ chown -R nodejs:nodejs /home/nodejs COPY --from=oracle-client /opt/oracle/instantclient /opt/oracle/instantclient ENV LD_LIBRARY_PATH=/opt/oracle/instantclient ENV ORACLE_HOME=/opt/oracle/instantclient ENV NODE_ENV=production ENV NPM_CONFIG_LOGLEVEL=warn WORKDIR /app COPY --from=dependencies --chown=nodejs:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist COPY --chown=nodejs:nodejs package*.json ./ USER nodejs EXPOSE 3001 HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD node -e "require('http').get('http://localhost:3001/', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["node", "dist/main.js"]