# Production image for Ponder indexer service # Used in CI for E2E testing - contains all code baked in FROM node:20-alpine AS builder RUN apk add --no-cache git bash WORKDIR /app # Copy package files first for better caching COPY package.json package-lock.json ./ COPY kraiken-lib/package.json kraiken-lib/package-lock.json ./kraiken-lib/ COPY services/ponder/package.json services/ponder/package-lock.json ./services/ponder/ # Copy ABI files needed by kraiken-lib COPY onchain/out/Kraiken.sol/Kraiken.json ./onchain/out/Kraiken.sol/ COPY onchain/out/Stake.sol/Stake.json ./onchain/out/Stake.sol/ # Install kraiken-lib dependencies and build WORKDIR /app/kraiken-lib RUN npm ci --ignore-scripts COPY kraiken-lib/ ./ RUN ./node_modules/.bin/tsc # Install ponder dependencies WORKDIR /app/services/ponder RUN npm ci # Copy ponder source COPY services/ponder/ ./ # Copy shared config files needed by ponder WORKDIR /app COPY onchain/deployments*.json ./onchain/ # Production image FROM node:20-alpine RUN apk add --no-cache dumb-init wget postgresql-client bash WORKDIR /app # Copy kraiken-lib with full structure (needed for node_modules symlink resolution) COPY --from=builder /app/kraiken-lib ./kraiken-lib # Copy ponder with all node_modules COPY --from=builder /app/services/ponder ./services/ponder # Copy onchain artifacts COPY --from=builder /app/onchain ./onchain # Copy entrypoint COPY docker/ci-entrypoints/ponder-ci-entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh WORKDIR /app/services/ponder ENV NODE_ENV=production ENV HOST=0.0.0.0 ENV PORT=42069 EXPOSE 42069 HEALTHCHECK --interval=5s --timeout=3s --retries=12 --start-period=20s \ CMD wget --spider -q http://127.0.0.1:42069/ || exit 1 ENTRYPOINT ["dumb-init", "--", "/entrypoint.sh"]