Files
kvarta_project/deploy/Dockerfile.landing
T
nunuchek 5f31b03203 fix(deploy): кросс-сборка — JS на машине сборки, нативные модули под целевую платформу
Под QEMU next build падает с segfault (SWC). Сборка идёт на $BUILDPLATFORM,
sharp ставится отдельной стадией под целевую платформу (NEXT_SHARP_PATH),
у better-sqlite3 остаётся prebuilt целевой архитектуры.
2026-10-17 16:14:43 +03:00

56 lines
3.0 KiB
Docker
Raw 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, под эмуляцией работает
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 \
NEXT_SHARP_PATH=/sharp/node_modules/sharp
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"]