# Stage 1: Composer dependencies FROM composer:2 AS vendor WORKDIR /app COPY composer.json composer.lock ./ RUN composer install \ --no-dev \ --no-interaction \ --no-scripts \ --prefer-dist \ --optimize-autoloader \ --ignore-platform-reqs # Stage 2: PHP-FPM production image FROM php:8.4-fpm-alpine # Install system dependencies RUN apk add --no-cache \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ libzip-dev \ libxml2-dev \ curl-dev \ oniguruma-dev \ icu-dev # Install PHP extensions RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install \ pdo_mysql \ bcmath \ mbstring \ gd \ curl \ zip \ xml \ intl \ opcache # Configure OPcache for production RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.interned_strings_buffer=8" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.max_accelerated_files=10000" >> /usr/local/etc/php/conf.d/opcache.ini \ && echo "opcache.validate_timestamps=0" >> /usr/local/etc/php/conf.d/opcache.ini # PHP production settings RUN echo "upload_max_filesize=20M" >> /usr/local/etc/php/conf.d/uploads.ini \ && echo "post_max_size=25M" >> /usr/local/etc/php/conf.d/uploads.ini WORKDIR /var/www/html # Copy application code COPY . . # Copy vendor from composer stage COPY --from=vendor /app/vendor ./vendor # Set permissions RUN chown -R www-data:www-data storage bootstrap/cache \ && chmod -R 775 storage bootstrap/cache # View cache (no depende de .env, se puede hacer en build) RUN php artisan view:cache # Entrypoint: cachear config y rutas con las variables reales de .env.prod RUN printf '#!/bin/sh\nphp artisan config:cache\nphp artisan route:cache\nexec "$@"\n' > /usr/local/bin/entrypoint.sh \ && chmod +x /usr/local/bin/entrypoint.sh EXPOSE 9000 ENTRYPOINT ["entrypoint.sh"] CMD ["php-fpm"]