```=dockerfile # Base stage FROM node:16-slim as base RUN apt-get update && apt-get install -y \ python3 \ build-essential \ curl \ && rm -rf /var/lib/apt/lists/* ENV NODE_ENV=production RUN mkdir /app && chown -R node:node /app WORKDIR /app USER node COPY --chown=node:node package.json package-lock*.json ./ RUN npm ci && npm cache clean --force # Local Development stage FROM base as dev ENV NODE_ENV=development ENV PATH /app/node_modules/.bin:$PATH RUN npm install --only=development CMD [ "npx", "nodemon", "--watch", "./dist", "--inspect=0.0.0.0:9222", "--nolazy", "-r", "tsconfig-paths/register", "-r", "./dist/src/bootstrap.js", "./dist/src/api/server.js" ] # Source code stage FROM base as source COPY --chown=node:node . . # Test stage FROM source as test ENV NODE_ENV=development COPY --from=dev /app/node_modules /app/node_modules RUN make lint-code # RUN make test. TODO: Unit/Integration tests split needed before running tests during image build process. # Optional Audit stage. Uncomment with proper aquasec credentials (env var MICROSCANNER_TOKEN) ⚠️ # FROM test as audit # USER root # RUN npm audit --audit-level critical # ARG MICROSCANNER_TOKEN # ADD https://get.aquasec.com/microscanner / # RUN chmod +x /microscanner # RUN /microscanner $MICROSCANNER_TOKEN --continue-on-failure # TS Build stage FROM source as build COPY --from=dev /app/node_modules /app/node_modules RUN make compile # Production final stage FROM build as prod COPY --from=build /app/dist /app/dist HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost:${PORT:-3000}/healthz || exit 1 CMD ["node", "-r", "tsconfig-paths/register", "-r", "dist/src/bootstrap.js", "./dist/src/api/server"] ``` ## docker compose ```` version: '3.9' services: database: image: postgres:14-alpine container_name: banq-db environment: - POSTGRES_PASSWORD=postgres - POSTGRES_DB=postgres - POSTGRES_USER=postgres ports: - '5432:5432' volumes: - ./.db/data:/var/lib/postgresql/data:delegated - ./.db/init:/docker-entrypoint-initdb.d healthcheck: test: pg_isready -U postgres -h 127.0.0.1 interval: 5s api: build: context: . target: dev container_name: banq-api depends_on: database: condition: service_healthy volumes: - ./dist:/app/dist:delegated - ./docs:/app/docs:delegated environment: - DATABASE_URL=postgres://postgres:postgres@database:5432/banq-db - PORT=3000 ports: - '3000:3000' - '9222:9222' ```