SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
3 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
3.3 KB · 68 lines
Raw Blame History
1# syntax=docker/dockerfile:1.72# DataCenterIndex — Next 16 web image (apps/web). No `output: "standalone"` in next.config.ts → `next start`3# with a pruned production node_modules.4# Build context = repo root:5#   docker build -f deploy/docker/Dockerfile.web --build-arg NEXT_PUBLIC_API_URL=https://www.datacenterindex.io .6ARG NODE_IMAGE=node:22-bookworm-slim7ARG PNPM_VERSION=11.1.289FROM ${NODE_IMAGE} AS base10ARG PNPM_VERSION11ENV PNPM_HOME=/pnpm \12    PATH=/pnpm:$PATH \13    npm_config_store_dir=/pnpm/store \14    NEXT_TELEMETRY_DISABLED=115RUN (corepack enable && corepack prepare "pnpm@${PNPM_VERSION}" --activate) \16 || npm install -g "pnpm@${PNPM_VERSION}" --no-fund --no-audit1718# Dev deps are needed for `next build` (tailwind, typescript) → full fetch.19FROM base AS fetch20WORKDIR /app21COPY pnpm-lock.yaml pnpm-workspace.yaml ./22RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store pnpm fetch && rm -rf node_modules2324# ---------------------------------------------------------------- build25FROM fetch AS build26ARG NEXT_PUBLIC_API_URL=https://www.datacenterindex.io27ARG NEXT_PUBLIC_SITE_URL=https://www.datacenterindex.io28ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} \29    NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL} \30    NODE_ENV=production31COPY . .32RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store \33    pnpm install --offline --frozen-lockfile --config.dangerously-allow-all-builds=true --config.confirm-modules-purge=false --filter "@dci/web..."34RUN --mount=type=cache,id=dci-next-cache,target=/app/apps/web/.next/cache \35    pnpm --filter @dci/web run build3637# ---------------------------------------------------------------- prod-deps: runtime node_modules only38FROM fetch AS prod-deps39COPY . .40RUN --mount=type=cache,id=dci-pnpm-store,target=/pnpm/store \41    pnpm install --offline --frozen-lockfile --config.dangerously-allow-all-builds=true --config.confirm-modules-purge=false --prod --filter "@dci/web..."4243# ---------------------------------------------------------------- runtime44FROM ${NODE_IMAGE} AS runtime45ENV NODE_ENV=production \46    NEXT_TELEMETRY_DISABLED=1 \47    PORT=8310 \48    HOSTNAME=0.0.0.049RUN apt-get update \50 && apt-get install -y --no-install-recommends tini ca-certificates \51 && rm -rf /var/lib/apt/lists/*52WORKDIR /app53COPY --from=prod-deps --chown=node:node /app/package.json /app/pnpm-workspace.yaml /app/tsconfig.base.json ./54COPY --from=prod-deps --chown=node:node /app/node_modules ./node_modules55COPY --from=prod-deps --chown=node:node /app/packages/core ./packages/core56COPY --from=prod-deps --chown=node:node /app/apps/web/node_modules ./apps/web/node_modules57COPY --from=prod-deps --chown=node:node /app/apps/web/package.json /app/apps/web/next.config.ts /app/apps/web/tsconfig.json ./apps/web/58COPY --from=build --chown=node:node /app/apps/web/public ./apps/web/public59COPY --from=build --chown=node:node /app/apps/web/.next ./apps/web/.next60USER node61WORKDIR /app/apps/web62EXPOSE 831063HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \64  CMD ["node", "-e", "fetch('http://127.0.0.1:'+(process.env.PORT||8310)+'/').then(r=>process.exit(r.status<500?0:1),()=>process.exit(1))"]65ENTRYPOINT ["/usr/bin/tini", "--"]66# package.json `start` binds 127.0.0.1 (laptop); inside the container Caddy must reach it → 0.0.0.0.67CMD ["node", "node_modules/next/dist/bin/next", "start", "-p", "8310", "-H", "0.0.0.0"]68