# Dockerfile # Multi-stage build for Laravel 12 + React SPA (Vite) # Targets: # - app: php-fpm runtime with vendor + built assets # - nginx: separate container (uses official nginx image, see docker-compose + nginx.conf) ############################ # 1) Node build (Vite) ############################ FROM node:20-alpine AS node-build WORKDIR /app # Install deps COPY package.json package-lock.json* pnpm-lock.yaml* yarn.lock* ./ RUN \ if [ -f package-lock.json ]; then npm ci; \ elif [ -f pnpm-lock.yaml ]; then corepack enable && pnpm i --frozen-lockfile; \ elif [ -f yarn.lock ]; then yarn install --frozen-lockfile; \ else npm i; fi # Build COPY resources ./resources COPY public ./public COPY vite.config.* hero.ts tailwind.config.* postcss.config.* tsconfig.* ./ RUN \ if [ -f package-lock.json ]; then npm run build; \ elif [ -f pnpm-lock.yaml ]; then pnpm build; \ elif [ -f yarn.lock ]; then yarn build; \ else npm run build; fi ############################ # 2) Composer deps ############################ FROM composer:2 AS composer-build WORKDIR /app COPY composer.json composer.lock ./ RUN composer install --no-dev --prefer-dist --no-interaction --no-progress --optimize-autoloader --no-scripts ############################ # 3) PHP runtime (php-fpm) ############################ FROM php:8.3-fpm-alpine AS app WORKDIR /var/www/html # System deps + PHP extensions RUN apk add --no-cache \ bash icu-dev libzip-dev oniguruma-dev zlib-dev \ freetype-dev libjpeg-turbo-dev libpng-dev \ git curl \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo_mysql mbstring intl zip bcmath exif gd opcache \ && rm -rf /var/cache/apk/* # PHP configuration (opcache tuned for prod) COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini COPY docker/php/php.ini /usr/local/etc/php/conf.d/php.ini # Copy application code COPY . . # Copy vendor from composer stage COPY --from=composer-build /app/vendor ./vendor # Copy built assets from node stage (Vite -> public/build by default) COPY --from=node-build /app/public/build ./public/build # Ensure writable dirs RUN mkdir -p storage bootstrap/cache \ && chown -R www-data:www-data storage bootstrap/cache # Entrypoint: caches/migrations optional; starts php-fpm COPY docker/app/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh USER www-data EXPOSE 9000 ENTRYPOINT ["/entrypoint.sh"] CMD ["php-fpm", "-F"] ############################ # 4) Nginx runtime (static + proxy to php-fpm) ############################ FROM nginx:1.27-alpine AS nginx WORKDIR /var/www/html # Nginx config COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf # Public files (incl. built Vite assets) COPY public ./public COPY --from=node-build /app/public/build ./public/build