# --- ÉTAPE 1 : BUILD (Node 20 est le compromis parfait) --- FROM node:20-alpine AS build-stage # Installation des outils pour les modules natifs RUN apk update && apk add --no-cache \ build-base \ gcc \ autoconf \ automake \ zlib-dev \ libpng-dev \ vips-dev \ git > /dev/null 2>&1 ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} WORKDIR /opt/ COPY package.json yarn.lock ./ # On installe avec Yarn. Node 20 satisfait toutes les contraintes d'engines. RUN yarn install --frozen-lockfile WORKDIR /opt/app COPY . . # Build de l'admin et du code TS RUN yarn build # --- ÉTAPE 2 : RUNTIME --- FROM node:20-alpine AS runtime-stage RUN apk add --no-cache vips-dev libpng libjpeg-turbo ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} WORKDIR /opt/app # On récupère les node_modules et le build COPY --from=build-stage /opt/node_modules ./node_modules COPY --from=build-stage /opt/app ./ ENV PATH=/opt/app/node_modules/.bin:$PATH RUN chown -R node:node /opt/app USER node EXPOSE 1337 CMD ["yarn", "start"]