51 lines
1.4 KiB
Docker
51 lines
1.4 KiB
Docker
# syntax=docker/dockerfile:1.7
|
|
|
|
# ---------- Build stage ----------
|
|
FROM node:24-trixie-slim AS build
|
|
|
|
ENV PNPM_HOME=/pnpm \
|
|
PATH=/pnpm:$PATH \
|
|
CI=1
|
|
|
|
RUN corepack enable
|
|
|
|
WORKDIR /app
|
|
|
|
COPY package.json pnpm-lock.yaml ./
|
|
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
|
|
pnpm install --frozen-lockfile
|
|
|
|
COPY . .
|
|
RUN pnpm run build
|
|
|
|
|
|
# ---------- Runtime stage ----------
|
|
FROM node:24-trixie-slim AS runtime
|
|
|
|
ENV NODE_ENV=production \
|
|
HOST=0.0.0.0 \
|
|
PORT=4321 \
|
|
ASTRO_TELEMETRY_DISABLED=1
|
|
|
|
RUN groupadd --system --gid 1001 astro \
|
|
&& useradd --system --uid 1001 --gid astro --shell /usr/sbin/nologin astro
|
|
|
|
WORKDIR /app
|
|
|
|
# Only what's needed to run `astro preview`
|
|
COPY --from=build --chown=astro:astro /app/package.json ./package.json
|
|
COPY --from=build --chown=astro:astro /app/node_modules ./node_modules
|
|
COPY --from=build --chown=astro:astro /app/dist ./dist
|
|
COPY --from=build --chown=astro:astro /app/astro.config.mjs ./astro.config.mjs
|
|
|
|
USER astro
|
|
|
|
EXPOSE 4321
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
|
CMD node -e "fetch('http://127.0.0.1:'+ (process.env.PORT||4321) +'/').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
|
|
|
# Invoke astro directly via node to avoid corepack/pnpm shims at runtime
|
|
# (the rootfs is read-only and corepack would try to write a cache dir).
|
|
CMD ["node", "./node_modules/astro/bin/astro.mjs", "preview", "--host", "0.0.0.0", "--port", "4321"]
|