stremio/deploy/docker/Dockerfile.master-api
Jos Vooges | STH 4e232e8ef6 Fix master-api Docker runtime: flat deps, explicit env, longer health start period.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 00:48:41 +02:00

50 lines
1.7 KiB
Text

FROM node:20-alpine AS base
RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
WORKDIR /app
FROM base AS builder
COPY package.json pnpm-workspace.yaml ./
COPY apps/master-api ./apps/master-api
COPY packages ./packages
RUN pnpm install --no-frozen-lockfile
RUN pnpm --filter @media-cluster/shared-types build
RUN pnpm --filter @media-cluster/protocol build
WORKDIR /app/apps/master-api
RUN pnpm exec prisma generate
RUN pnpm build
# Assemble a flat runtime directory (avoids broken pnpm symlinks in final image)
WORKDIR /app
RUN mkdir -p /out/node_modules/@media-cluster \
&& cp -R apps/master-api/dist /out/dist \
&& cp -R apps/master-api/prisma /out/prisma \
&& cp apps/master-api/package.json /out/package.json \
&& cp -R packages/shared-types /out/node_modules/@media-cluster/shared-types \
&& cp -R packages/protocol /out/node_modules/@media-cluster/protocol
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN apk add --no-cache openssl wget python3 make g++
COPY --from=builder /out/ ./
# Drop workspace: protocol deps; keep prisma CLI for migrate
RUN node -e "\
const fs=require('fs');\
const p=JSON.parse(fs.readFileSync('package.json','utf8'));\
delete p.dependencies['@media-cluster/protocol'];\
delete p.dependencies['@media-cluster/shared-types'];\
p.dependencies.prisma = (p.devDependencies && p.devDependencies.prisma) || '6.3.1';\
delete p.devDependencies;\
delete p.scripts;\
fs.writeFileSync('package.json', JSON.stringify(p, null, 2));"
RUN npm install --omit=dev \
&& npx prisma generate \
&& apk del python3 make g++
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=5 \
CMD wget -qO- http://127.0.0.1:3000/health || exit 1
CMD ["sh", "-c", "npx prisma migrate deploy && node dist/app.js"]