| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- # Multi-stage build for optimized image size
- FROM node:18-alpine AS builder
- WORKDIR /app
- # Copy package files
- COPY package*.json ./
- # Install dependencies
- RUN npm ci
- # Copy source files
- COPY tsconfig.json ./
- COPY src ./src
- # Build the project
- RUN npm run build
- # Production stage
- FROM node:18-alpine
- WORKDIR /app
- # Copy package files
- COPY package*.json ./
- # Install only production dependencies
- RUN npm ci --only=production && \
- npm cache clean --force
- # Copy built files from builder stage
- COPY --from=builder /app/dist ./dist
- # Create a non-root user
- RUN addgroup -g 1001 -S nodejs && \
- adduser -S nodejs -u 1001
- # Change ownership of the app directory
- RUN chown -R nodejs:nodejs /app
- # Switch to non-root user
- USER nodejs
- # Set environment variables
- ENV NODE_ENV=production
- # The server uses stdio transport, so it doesn't need a port
- # But we'll expose one in case needed for health checks or future features
- EXPOSE 3000
- # Start the server
- CMD ["node", "dist/index.js"]
|