task_receipts/server/Dockerfile

40 lines
1.1 KiB
Docker

# Build stage
FROM node:18 AS builder
WORKDIR /app
# Copy root package files for workspaces
COPY package.json ./
COPY package-lock.json ./
# Copy server and shared code
COPY server/ ./server/
COPY shared/ ./shared/
# Install dependencies for server workspace
RUN npm ci --workspace=server
# Build the server
WORKDIR /app/server
RUN npm run build
# Production stage
FROM node:18-slim
RUN apt-get update && apt-get install -y dumb-init && rm -rf /var/lib/apt/lists/*
RUN groupadd -r nodejs && useradd -r -g nodejs nodejs
WORKDIR /app/server
# Copy only server package.json and built code
COPY server/package.json ./
COPY --from=builder /app/server/dist ./dist
COPY --from=builder /app/shared ../shared
# Install only production dependencies
RUN npm install --omit=dev && npm cache clean --force
RUN chown -R nodejs:nodejs /app
USER nodejs
EXPOSE 4000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node -e "require('http').get('http://localhost:4000/graphql', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })"
ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "dist/server/src/index.js"]