# syntax=docker/dockerfile:1.7 FROM node:24-slim AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . ARG APP_NAME="Example Website" ARG APP_URL="https://example.com" ARG COMPANY_NAME="Example Company" ARG CONTACT_EMAIL="info@example.com" ARG CONTACT_PHONE="+49 000 000000" ARG CONTACT_ADDRESS="Example Street 1, 12345 Example City" ARG SKIP_IMAGE_OPTIMIZATION=false ARG IMAGE_CACHE_NAMESPACE=shared ENV APP_NAME=${APP_NAME} \ APP_URL=${APP_URL} \ COMPANY_NAME=${COMPANY_NAME} \ CONTACT_EMAIL=${CONTACT_EMAIL} \ CONTACT_PHONE=${CONTACT_PHONE} \ CONTACT_ADDRESS=${CONTACT_ADDRESS} ENV NEXT_TELEMETRY_DISABLED=1 RUN --mount=type=cache,id=website-starter-image-assets-${IMAGE_CACHE_NAMESPACE},target=/image-cache,sharing=locked \ IMAGE_CACHE_ROOT=/image-cache \ SKIP_IMAGE_OPTIMIZATION=${SKIP_IMAGE_OPTIMIZATION} \ npm run build FROM node:24-slim AS runtime # Apply Debian security updates that may not yet be included in the Node base # image. Clear package metadata in the same layer so it is not part of the # runtime image. # The server starts with Node directly and does not need npm at runtime. Removing # npm also keeps its build-only dependency tree out of the production image. RUN apt-get update \ && apt-get upgrade -y \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /usr/local/lib/node_modules/npm \ /usr/local/bin/npm \ /usr/local/bin/npx ARG BUILD_DATE="" ARG VCS_REF="" ARG SOURCE_URL="https://example.com/repository" LABEL org.opencontainers.image.created="$BUILD_DATE" \ org.opencontainers.image.revision="$VCS_REF" \ org.opencontainers.image.source="$SOURCE_URL" \ org.opencontainers.image.title="website-starter" ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ HOSTNAME=0.0.0.0 \ PORT=3000 WORKDIR /app COPY --from=build --chown=node:node /app/.next/standalone ./ COPY --from=build --chown=node:node /app/.next/static ./.next/static COPY --from=build --chown=node:node /app/public ./public USER node EXPOSE 3000 CMD ["node", "server.js"]