### Etapa 1: Composer Builder FROM composer:2 AS composer_builder WORKDIR /app # Copiamos solo composer.json y composer.lock COPY ../../composer.json ../../composer.lock ./ RUN composer clear-cache \ && composer install --no-dev --optimize-autoloader --prefer-source --no-interaction ### ### Etapa 2: Vite Builder (Node) ### FROM node:20-alpine AS vite_builder WORKDIR /frontend # Copiamos package.json y package-lock.json COPY ../../package.json ../../package-lock.json ./ RUN npm ci --silent --no-progress # Copiamos assets de vendor (si los paquetes Koneko los exponen) #COPY --from=composer_builder /app/vendor/koneko/laravel-vuexy-admin/resources/assets ./vendor/koneko/laravel-vuexy-admin/resources/assets # Copiamos el resto del código fuente COPY ../../ ./ # Build con Vite RUN npm run build ### ### Etapa 3: PHP-FPM Final ### FROM php:8.2-fpm-alpine AS final WORKDIR /var/www # 1) Instalamos extensiones PHP (igual que antes) RUN apk add --no-cache \ bash \ git \ unzip \ libzip-dev \ oniguruma-dev \ shadow \ curl \ supervisor \ libpng-dev \ libjpeg-turbo-dev \ libwebp-dev \ libxpm-dev \ libxml2-dev \ $PHPIZE_DEPS \ && pecl install redis \ && docker-php-ext-enable redis \ && docker-php-ext-install \ pdo \ pdo_mysql \ mbstring \ zip \ bcmath \ opcache \ && apk del $PHPIZE_DEPS \ && rm -rf /var/cache/apk/* # 2) Creamos usuario “appuser” RUN addgroup -g 1000 appuser \ && adduser -D -u 1000 -G appuser appuser # 3) Copiamos vendor y composer.json desde composer_builder COPY --from=composer_builder /app/vendor ./vendor COPY --from=composer_builder /app/composer.json ./composer.json COPY --from=composer_builder /app/composer.lock ./composer.lock # 4) Copiamos todo el resto del app PHP COPY ../../ ./ # 5) Copiamos los assets compilados por Vite (public/build) COPY --from=vite_builder /frontend/public/build ./public/build # 6) Copiamos configuración de opcache COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini # 7) Ajustamos permisos finales RUN chown -R appuser:appuser /var/www USER appuser CMD ["php-fpm"]