Files
dashboard/backend/Dockerfile
Matthias Hochmeister d2dc64d54a new features
2026-03-23 13:14:33 +01:00

76 lines
1.8 KiB
Docker

# ===========================
# Build Stage
# ===========================
FROM node:20-alpine AS builder
# Set working directory
WORKDIR /app
# Install build dependencies
RUN apk add --no-cache python3 make g++
# Copy package files for dependency installation
COPY package*.json ./
# Install all dependencies including devDependencies regardless of NODE_ENV
RUN npm ci --include=dev
# Expose local binaries (e.g. tsc) to the shell PATH so npm run build resolves them
ENV PATH="/app/node_modules/.bin:$PATH"
# Copy TypeScript configuration and source code
COPY tsconfig.json ./
COPY src ./src
# Build TypeScript to JavaScript
RUN npm run build
# Prune dev dependencies
RUN npm prune --production
# ===========================
# Production Stage
# ===========================
FROM node:20-alpine AS production
# Install wget for health checks
RUN apk add --no-cache wget
# Create non-root user for security
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
# Set working directory
WORKDIR /app
# Copy package files
COPY package*.json ./
# Copy production node_modules from builder
COPY --from=builder /app/node_modules ./node_modules
# Copy compiled JavaScript from builder
COPY --from=builder /app/dist ./dist
# Copy database migrations (needed for runtime)
COPY --from=builder /app/src/database/migrations ./dist/database/migrations
# Create logs and uploads directories
RUN mkdir -p /app/logs /app/uploads/bestellungen/thumbnails
# Change ownership to non-root user
RUN chown -R nodejs:nodejs /app
# Switch to non-root user
USER nodejs
# Expose application port
EXPOSE 3000
# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=40s \
CMD wget --quiet --tries=1 --spider http://localhost:3000/health || exit 1
# Start the application
CMD ["node", "dist/server.js"]