# astro-docs — Astro + Starlight documentation site # Serves on 7701 via the Astro Node adapter (standalone). No proxy, no auth. ARG NODE_VERSION=24 # ---------- base ---------- FROM node:24-alpine AS base ENV NPM_CONFIG_UPDATE_NOTIFIER=false \ NPM_CONFIG_FUND=false \ NPM_CONFIG_AUDIT=false \ ASTRO_TELEMETRY_DISABLED=1 WORKDIR /app # ---------- dependencies (dev + prod, for the build) ---------- FROM base AS deps COPY package.json package-lock.json* ./ RUN if [ -f package-lock.json ]; then npm ci --include=dev; else npm install --include=dev; fi # ---------- dependencies (prod only, for the runtime) ---------- FROM base AS prod-deps COPY package.json package-lock.json* ./ RUN if [ -f package-lock.json ]; then npm ci --omit=dev; else npm install --omit=dev; fi # ---------- build ---------- FROM deps AS build ENV NODE_ENV=production COPY . . RUN npm run build # ---------- runtime ---------- FROM base AS runtime ENV NODE_ENV=production \ HOST=0.0.0.0 \ PORT=7701 COPY --from=prod-deps --chown=node:node /app/node_modules ./node_modules COPY --from=build --chown=node:node /app/dist ./dist COPY --from=build --chown=node:node /app/package.json ./package.json USER node EXPOSE 7701 HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ CMD node -e "fetch('http://127.0.0.1:'+(process.env.PORT||7701)+'/').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" CMD ["node", "./dist/server/entry.mjs"]