Next 16 грузит sharp обычным require и NEXT_SHARP_PATH не читает: без sharp /_next/image отдавал исходный JPEG. Критик 3 (9/10): точка-разделитель нот и «·» в скобке недели не висят в начале/конце строки, имя и фамилия латиницей не разрываются.
57 lines
3.2 KiB
Docker
57 lines
3.2 KiB
Docker
# 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"]
|