Files
nunuchek b662e89058 fix(landing): sharp в образе через NODE_PATH; итерация критика 3 — переносы
Next 16 грузит sharp обычным require и NEXT_SHARP_PATH не читает: без sharp
/_next/image отдавал исходный JPEG. Критик 3 (9/10): точка-разделитель
нот и «·» в скобке недели не висят в начале/конце строки, имя и фамилия
латиницей не разрываются.
2026-10-17 17:13:36 +03:00

57 lines
3.2 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syntax=docker/dockerfile:1
# Сборка из корня репо:
# docker buildx build --platform linux/amd64 -f deploy/Dockerfile.landing -t kvarta-landing .
# JS собирается нативно на машине сборки: под эмуляцией QEMU next build падает с segfault (SWC).
# Результат сборки платформонезависим, кроме sharp — его ставим отдельно под целевую платформу.
FROM --platform=$BUILDPLATFORM node:22-alpine AS build
# corepack из node 22 может не знать ключи свежего pnpm — обновляем его
RUN npm install -g corepack@latest >/dev/null && corepack enable
ENV NEXT_TELEMETRY_DISABLED=1
WORKDIR /repo
# сначала только манифесты — слой с зависимостями кешируется
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.base.json ./
COPY apps/landing/package.json apps/landing/
COPY packages/shared/package.json packages/shared/
RUN corepack install
RUN --mount=type=cache,id=kvarta-pnpm-alpine,target=/pnpm-store \
pnpm install --frozen-lockfile --store-dir /pnpm-store \
--filter kvarta --filter "@kvarta/landing..."
COPY apps/landing apps/landing
COPY packages/shared packages/shared
RUN pnpm --filter @kvarta/landing build \
&& mkdir -p apps/landing/public \
&& rm -rf apps/landing/.next/standalone/node_modules/.pnpm/@img+sharp-*
# sharp для next/image под целевую платформу; npm — чистый JS, под эмуляцией работает.
# Next 16 грузит его обычным require("sharp") (NEXT_SHARP_PATH больше не читает) — находит через NODE_PATH.
FROM node:22-alpine AS sharp
WORKDIR /sharp
RUN npm install --omit=dev --no-audit --no-fund sharp@0.35.5 >/dev/null
# рантайму не нужны npm/corepack/yarn (~23 МБ); удалить их слоем поверх базы нельзя —
# размер не уменьшится, поэтому чистим и сплющиваем базу в один слой через scratch
FROM node:22-alpine AS node-base
RUN rm -rf /usr/local/lib/node_modules /usr/local/bin/npm /usr/local/bin/npx \
/usr/local/bin/corepack /usr/local/bin/yarn /usr/local/bin/yarnpkg /opt/yarn-* \
/usr/local/include /root/.npm /tmp/* \
&& addgroup -S -g 1001 kvarta && adduser -S -u 1001 -G kvarta kvarta
FROM scratch AS runtime
COPY --from=node-base / /
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
PORT=3000 \
HOSTNAME=0.0.0.0 \
NODE_PATH=/sharp/node_modules
WORKDIR /app
# outputFileTracingRoot = корень репо, поэтому server.js лежит в apps/landing/ внутри standalone
COPY --from=build --chown=kvarta:kvarta /repo/apps/landing/.next/standalone ./
COPY --from=build --chown=kvarta:kvarta /repo/apps/landing/.next/static ./apps/landing/.next/static
COPY --from=build --chown=kvarta:kvarta /repo/apps/landing/public ./apps/landing/public
COPY --from=sharp /sharp/node_modules /sharp/node_modules
USER kvarta
EXPOSE 3000
CMD ["node", "apps/landing/server.js"]