diff --git a/deploy/docker/Dockerfile.master-api b/deploy/docker/Dockerfile.master-api index de9af97..ea13f76 100644 --- a/deploy/docker/Dockerfile.master-api +++ b/deploy/docker/Dockerfile.master-api @@ -13,22 +13,26 @@ 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 \ +RUN mkdir -p /out \ && 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 + && mkdir -p /out/local-packages \ + && cp -R packages/shared-types /out/local-packages/shared-types \ + && cp -R packages/protocol /out/local-packages/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 +COPY --from=builder /out/dist ./dist +COPY --from=builder /out/prisma ./prisma +COPY --from=builder /out/package.json ./package.json +COPY --from=builder /out/local-packages ./local-packages + +# Remove workspace protocol deps before npm install RUN node -e "\ const fs=require('fs');\ const p=JSON.parse(fs.readFileSync('package.json','utf8'));\ @@ -43,6 +47,22 @@ RUN npm install --omit=dev \ && npx prisma generate \ && apk del python3 make g++ +# IMPORTANT: copy workspace packages AFTER npm install (npm wipes node_modules) +RUN mkdir -p node_modules/@media-cluster \ + && cp -R local-packages/shared-types node_modules/@media-cluster/shared-types \ + && cp -R local-packages/protocol node_modules/@media-cluster/protocol \ + && node -e "\ +const fs=require('fs');\ +const p=JSON.parse(fs.readFileSync('node_modules/@media-cluster/protocol/package.json','utf8'));\ +p.dependencies={'@media-cluster/shared-types':'1.0.0'};\ +delete p.devDependencies;\ +fs.writeFileSync('node_modules/@media-cluster/protocol/package.json', JSON.stringify(p,null,2));\ +const s=JSON.parse(fs.readFileSync('node_modules/@media-cluster/shared-types/package.json','utf8'));\ +delete s.devDependencies;\ +fs.writeFileSync('node_modules/@media-cluster/shared-types/package.json', JSON.stringify(s,null,2));\ +" \ + && node -e "require('@media-cluster/protocol'); require('@media-cluster/shared-types'); console.log('workspace packages ok')" + EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=5 \ CMD wget -qO- http://127.0.0.1:3000/health || exit 1