diff --git a/apps/edr-freight-api/Dockerfile b/apps/edr-freight-api/Dockerfile index d88029a80..124016e07 100644 --- a/apps/edr-freight-api/Dockerfile +++ b/apps/edr-freight-api/Dockerfile @@ -7,6 +7,9 @@ RUN apk add --no-cache libc6-compat # `--mount=type=cache,target=/pnpm/store` cache actually persists deps across builds. ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" +# Puppeteer ships a glibc Chrome that cannot run on Alpine; skip the ~150MB +# download at install time. The runner stage installs Alpine's system Chromium. +ENV PUPPETEER_SKIP_DOWNLOAD=true RUN corepack enable WORKDIR /app @@ -32,8 +35,23 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm deploy --filter="@edr/freight-api" --prod --legacy /deploy FROM node:24.15.0-alpine AS runner -RUN apk add --no-cache libc6-compat +# Chromium + fonts for Puppeteer PDF rendering (contract/invoice/receipt docs). +# Without these, Puppeteer fails to launch and the code degrades to an +# unformatted plain-text PDF fallback. Use Alpine's system Chromium (musl-built); +# the glibc Chrome that `puppeteer install` downloads cannot run on Alpine. +RUN apk add --no-cache \ + libc6-compat \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + font-noto-cjk ENV NODE_ENV=production +# Point Puppeteer at the system Chromium and skip its bundled download. +ENV PUPPETEER_SKIP_DOWNLOAD=true +ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser WORKDIR /app RUN addgroup --system --gid 1001 nodejs \ && adduser --system --uid 1001 --ingroup nodejs nestjs