# Use the official Node.js runtime as the base image FROM node:20-alpine AS base # Set the working directory inside the container WORKDIR /app # Copy package.json and package-lock.json (if available) COPY package*.json ./ # Install all dependencies (including devDependencies for building) RUN npm ci && npm cache clean --force # Copy the rest of the application code COPY . . # Set build-time environment variables for SvelteKit ARG DATABASE_URL="postgresql://builduser:buildpass@localhost:5432/builddb" ENV DATABASE_URL=${DATABASE_URL} # Run SvelteKit sync to generate .svelte-kit directory and prepare the build RUN npm run prepare # Build the application with environment variables available RUN npm run build # Production stage FROM node:20-alpine AS production # Install dumb-init for proper signal handling RUN apk add --no-cache dumb-init # Create a non-root user RUN addgroup -g 1001 -S nodejs RUN adduser -S svelte -u 1001 # Set the working directory WORKDIR /app # Copy package.json and package-lock.json COPY package*.json ./ # Install only production dependencies RUN npm ci --only=production && npm cache clean --force # Copy the built application from the previous stage COPY --from=base --chown=svelte:nodejs /app/build ./build COPY --from=base --chown=svelte:nodejs /app/package.json ./package.json # Switch to the non-root user USER svelte # Expose the port the app runs on EXPOSE 3000 # Set environment variables - DATABASE_URL can be overridden at runtime ENV NODE_ENV=production ENV PORT=3000 ENV DATABASE_URL="" # Use dumb-init to handle signals properly ENTRYPOINT ["dumb-init", "--"] # Start the application with environment file support CMD ["node", "build"]