#-------------------------------------------- # Stage: building TypeScript #-------------------------------------------- FROM node:20 AS build-stage ENV WORKDIR=/app WORKDIR /app COPY ./package*.json ./ # instaliram pakete RUN npm i && npm cache clean --force COPY ./tsconfig.json ./ COPY ./src ./src RUN npm run build #-------------------------------------------- # Stage: instaliram produkcijski node_modules #-------------------------------------------- FROM node:20 AS package-stage WORKDIR /app COPY ./package*.json ./ # instaliram SAMO produkcijske RUN npm i --omit=dev && npm cache clean --force #-------------------------------------------- # Stage: priprema finalnog image-a #-------------------------------------------- FROM gcr.io/distroless/nodejs:20 AS assembly-stage WORKDIR /app ARG PORT ENV PORT=${PORT} # (optional) App label to be used in Prometheus (Grafana) ARG PROMETHEUS_APP_LABEL ENV PROMETHEUS_APP_LABEL=${PROMETHEUS_APP_LABEL}=${PROMETHEUS_APP_LABEL} # (optional) Prometheus histogram bucket sizes (grafana) ARG PROMETHEUS_HISTOGRAM_BUCKETS ENV PROMETHEUS_HISTOGRAM_BUCKETS=${PROMETHEUS_HISTOGRAM_BUCKETS}=${PROMETHEUS_HISTOGRAM_BUCKETS} # CORS settings: kojim domenama dopuštam pristup slikama ARG CORS_ALLOWED_ORIGINS ENV CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS} # (optional) IP Address whitelist za metrics i prtg router ARG METRICS_ALLOWED_IP_ADDRESSES ENV METRICS_ALLOWED_IP_ADDRESSES=${METRICS_ALLOWED_IP_ADDRESSES} # (optional) uključuje logging u stdout ARG DEBUG ENV DEBUG=${DEBUG} # kopiram node-modules COPY --from=package-stage /app/package*.json ./ COPY --from=package-stage /app/node_modules ./node_modules # kopiram buildane datoteke COPY --from=build-stage /app/build ./server # server vrtim pod ograničenim "nobody" korisnikom USER nobody:nobody HEALTHCHECK --interval=30s --timeout=3s --start-period=10s \ CMD ["/nodejs/bin/node", "./server/healthcheck.js"] # pokrećem server CMD ["./server/entry.js"]