# ── Stage 1 : build des assets frontend ───────────────────────────────────── FROM node:22-alpine AS frontend WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci --ignore-scripts COPY . . RUN npm run build # ── Stage 2 : image de production PHP/FrankenPHP ───────────────────────────── FROM dunglas/frankenphp:php8.4-alpine WORKDIR /app RUN install-php-extensions \ pdo_pgsql \ opcache \ pcntl \ zip \ intl COPY --from=composer:2 /usr/bin/composer /usr/bin/composer COPY composer.json composer.lock ./ RUN composer install \ --no-dev \ --no-interaction \ --prefer-dist \ --optimize-autoloader \ --no-scripts COPY . . # Écrase public/build avec les assets compilés par le stage frontend COPY --from=frontend /app/public/build ./public/build RUN composer dump-autoload --optimize RUN php artisan config:cache RUN php artisan route:cache RUN php artisan view:cache RUN chown -R www-data:www-data storage bootstrap/cache EXPOSE 8000 CMD ["frankenphp", "php-server", "--listen", "0.0.0.0:8000"]