# syntax=docker/dockerfile:1 # # ---- 1. Frontend build (Vite: Vue + TS + SCSS) ---- # FROM node:20-alpine AS frontend WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY resources/ resources/ COPY vite.config.ts tsconfig.json tsconfig.node.json ./ RUN npm run build # # ---- 2. PHP dependencies (no dev, no scripts — no app code/DB available yet) ---- # FROM composer:2 AS vendor WORKDIR /app COPY composer.json composer.lock ./ RUN composer install \ --no-dev \ --no-scripts \ --no-interaction \ --no-progress \ --prefer-dist \ --optimize-autoloader # # ---- 3. Application image (PHP-FPM) ---- # FROM php:8.4-fpm-alpine AS app RUN apk add --no-cache \ postgresql-libs \ icu-libs \ oniguruma \ libzip \ su-exec \ && apk add --no-cache --virtual .build-deps \ postgresql-dev \ icu-dev \ oniguruma-dev \ libzip-dev \ linux-headers \ $PHPIZE_DEPS \ && docker-php-ext-install -j$(nproc) pdo pdo_pgsql bcmath intl zip pcntl opcache \ && pecl install redis \ && docker-php-ext-enable redis \ && apk del .build-deps COPY docker/php/production.ini /usr/local/etc/php/conf.d/zz-production.ini COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/zz-opcache.ini WORKDIR /var/www/html COPY --from=vendor /app/vendor vendor/ COPY . . COPY --from=frontend /app/public/build public/build RUN php artisan package:discover --ansi RUN chown -R www-data:www-data storage bootstrap/cache \ && chmod -R 775 storage bootstrap/cache COPY docker/php/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] CMD ["php-fpm"] # # ---- 4. Nginx (static assets + reverse proxy to php-fpm) ---- # FROM nginx:1.27-alpine AS nginx COPY --from=app /var/www/html/public /var/www/html/public COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf