# syntax=docker/dockerfile:1.7 # DataCenterIndex — Fastify API image (apps/api, run with tsx like the worker). # Build context = repo root: docker build -f deploy/docker/Dockerfile.api . ARG NODE_IMAGE=node:22-bookworm-slim ARG PNPM_VERSION=11.1.2 ARG TSX_VERSION=4.23.13 FROM ${NODE_IMAGE} AS base ARG PNPM_VERSION ENV PNPM_HOME=/pnpm \ PATH=/pnpm:$PATH \ npm_config_store_dir=/pnpm/store RUN (corepack enable && corepack prepare "pnpm@${PNPM_VERSION}" --activate) \ || npm install -g "pnpm@${PNPM_VERSION}" --no-fund --no-audit FROM base AS fetch WORKDIR /app COPY pnpm-lock.yaml pnpm-workspace.yaml ./ RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store pnpm fetch --prod && rm -rf node_modules FROM fetch AS deps COPY . . RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store \ pnpm install --offline --frozen-lockfile --config.dangerously-allow-all-builds=true --config.confirm-modules-purge=false --prod --filter "@dci/api..." \ && rm -rf apps/web apps/worker scripts FROM ${NODE_IMAGE} AS runtime ARG TSX_VERSION ENV NODE_ENV=production \ NODE_OPTIONS=--enable-source-maps \ DCI_CONFIG_DIR=/app/config/connectors \ API_PORT=8311 \ HOST=0.0.0.0 RUN apt-get update \ && apt-get install -y --no-install-recommends tini ca-certificates \ && rm -rf /var/lib/apt/lists/* \ && npm install -g "tsx@${TSX_VERSION}" --no-fund --no-audit \ && npm cache clean --force WORKDIR /app COPY --from=deps --chown=node:node /app/package.json /app/pnpm-workspace.yaml /app/tsconfig.base.json ./ COPY --from=deps --chown=node:node /app/node_modules ./node_modules COPY --from=deps --chown=node:node /app/packages ./packages COPY --from=deps --chown=node:node /app/apps/api ./apps/api COPY --from=deps --chown=node:node /app/config ./config COPY --chmod=755 deploy/docker/entrypoint.sh /usr/local/bin/dci-entrypoint RUN ln -s /usr/local/lib/node_modules/tsx /app/node_modules/tsx USER node EXPOSE 8311 HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \ CMD ["node", "-e", "fetch('http://127.0.0.1:'+(process.env.API_PORT||8311)+'/api/ready').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))"] ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/dci-entrypoint"] CMD ["api"]