# syntax=docker/dockerfile:1 ### Base Image ### FROM node:18-alpine AS base ### Dependencies Stage ### FROM base AS deps # Use default Alpine mirror (or Tsinghua if preferred) RUN echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.18/main" > /etc/apk/repositories && \ echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.18/community" >> /etc/apk/repositories && \ apk update --no-cache && \ apk add --no-cache vips-dev WORKDIR /app COPY package.json package-lock.json ./ # Enforce prebuilt sharp binaries ENV SHARP_IGNORE_GLOBAL_LIBVIPS=true RUN npm install ### Builder Stage ### FROM base AS builder RUN echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.18/main" > /etc/apk/repositories && \ echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.18/community" >> /etc/apk/repositories && \ apk update --no-cache && \ apk add --no-cache vips-dev WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build ### Production Runner Stage ### FROM nginx:alpine AS runner WORKDIR /usr/share/nginx/html # Set permissions for default nginx user RUN mkdir -p /var/cache/nginx /var/run/nginx && \ chown -R nginx:nginx /var/cache/nginx /var/run/nginx /usr/share/nginx/html && \ chmod -R 755 /var/cache/nginx /var/run/nginx /usr/share/nginx/html # Remove default Nginx assets RUN rm -rf ./* # Copy static assets from builder COPY --from=builder --chown=nginx:nginx /app/public . # Expose port EXPOSE 80 # Healthcheck HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:80 || exit 1 # Run Nginx CMD ["nginx", "-g", "daemon off;"]