Added the pnpm-workspace.yaml file to the Dockerfile to support overrides in pnpm 11, ensuring compatibility with the frozen lockfile during installation. This change enhances the package management process by addressing configuration mismatches and streamlining the build process.
49 lines
3.6 KiB
Docker
49 lines
3.6 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
# ── Stage 1: сборка фронтенда (Vite → dist) ───────────────────────────────
|
|
FROM node:22-alpine AS frontend
|
|
WORKDIR /app/frontend
|
|
RUN corepack enable
|
|
# pnpm-workspace.yaml здесь не про воркспейсы: в pnpm 11 там живут overrides, и без него
|
|
# --frozen-lockfile падает на несовпадении конфигурации с локом.
|
|
COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./
|
|
# --ignore-scripts: ни один пакет фронта не требует postinstall, поэтому lifecycle-скрипты зависимостей
|
|
# в сборке не выполняются — компрометация любого пакета в дереве не даёт исполнения кода на этапе install.
|
|
RUN corepack prepare pnpm@11.9.0 --activate && pnpm install --frozen-lockfile --ignore-scripts
|
|
COPY frontend/ ./
|
|
RUN pnpm build
|
|
|
|
# ── Stage 2: publish бэкенда, статика фронта в wwwroot ────────────────────
|
|
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS backend
|
|
WORKDIR /src
|
|
COPY backend/Directory.Build.props backend/Directory.Packages.props ./backend/
|
|
COPY backend/src/TeleWave.Domain/TeleWave.Domain.csproj ./backend/src/TeleWave.Domain/
|
|
COPY backend/src/TeleWave.Application/TeleWave.Application.csproj ./backend/src/TeleWave.Application/
|
|
COPY backend/src/TeleWave.Infrastructure/TeleWave.Infrastructure.csproj ./backend/src/TeleWave.Infrastructure/
|
|
COPY backend/src/TeleWave.Api/TeleWave.Api.csproj ./backend/src/TeleWave.Api/
|
|
RUN dotnet restore backend/src/TeleWave.Api/TeleWave.Api.csproj
|
|
COPY backend/ ./backend/
|
|
# Статика собранного фронта → wwwroot (перекрывает заглушку)
|
|
COPY --from=frontend /app/frontend/dist/ ./backend/src/TeleWave.Api/wwwroot/
|
|
RUN dotnet publish backend/src/TeleWave.Api/TeleWave.Api.csproj -c Release -o /app/publish --no-restore
|
|
|
|
# ── Stage 3: runtime ──────────────────────────────────────────────────────
|
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
WORKDIR /app
|
|
# curl — для HEALTHCHECK; ffmpeg — нормализация и нарезка медиа при загрузке (см. Media__FfmpegPath);
|
|
# fonts-dejavu-core — кириллический TTF для текста на ТВ-заставках (drawtext, см. Bumpers__FontFile).
|
|
RUN apt-get update && apt-get install -y --no-install-recommends curl ffmpeg fonts-dejavu-core \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
ENV ASPNETCORE_ENVIRONMENT=Production \
|
|
ASPNETCORE_HTTP_PORTS=8080
|
|
EXPOSE 8080
|
|
COPY --from=backend /app/publish ./
|
|
# Работаем под непривилегированным пользователем образа aspnet (app, uid/gid 1654 — $APP_UID задан
|
|
# в самом образе). Порт 8080 непривилегированный, установка пакетов уже позади, приложению нужна
|
|
# только запись в /media. ВАЖНО: bind-mount пробрасывает права хоста как есть — каталог хранилища
|
|
# должен принадлежать uid 1654, иначе контейнер не сможет писать (см. docs/server-storage-setup.md § 5).
|
|
USER $APP_UID
|
|
HEALTHCHECK --interval=15s --timeout=5s --start-period=20s --retries=5 \
|
|
CMD curl -f http://localhost:8080/health || exit 1
|
|
ENTRYPOINT ["dotnet", "TeleWave.Api.dll"]
|