FROM dunglas/frankenphp:php8.4-alpine AS base RUN install-php-extensions \ intl \ opcache \ pdo_pgsql \ zip COPY --from=composer:2 /usr/bin/composer /usr/bin/composer WORKDIR /app ### # Dev stage ### FROM base AS dev COPY composer.json composer.lock symfony.lock ./ RUN composer install --no-scripts --no-autoloader --prefer-dist COPY . . RUN composer dump-autoload ENV APP_ENV=dev \ SERVER_NAME=":80" \ POSTGRES_HOST=database \ POSTGRES_PORT=5432 \ POSTGRES_VERSION=16 \ POSTGRES_DB=app \ POSTGRES_USER=app \ POSTGRES_PASSWORD=pwd ### # Composer install stage (provides vendor assets for node build) ### FROM base AS composer-deps COPY composer.json composer.lock symfony.lock ./ RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist ### # Node build stage (for prod assets) ### FROM node:22-alpine AS node-build WORKDIR /app # Copy vendor UX assets so npm can resolve file: dependencies COPY --from=composer-deps /app/vendor/symfony/ux-react/assets vendor/symfony/ux-react/assets COPY package.json package-lock.json* ./ RUN npm install COPY assets/ ./assets/ COPY vite.config.js ./ RUN npm run build ### # Prod stage ### FROM base AS prod COPY composer.json composer.lock symfony.lock ./ RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist COPY . . # Copy Vite-built assets COPY --from=node-build /app/public/build /app/public/build RUN APP_ENV=prod composer dump-autoload --classmap-authoritative \ && APP_ENV=prod composer run-script post-install-cmd \ && chown -R www-data:www-data var/ ENV APP_ENV=prod \ SERVER_NAME=localhost \ POSTGRES_HOST=database \ POSTGRES_PORT=5432 \ POSTGRES_VERSION=16 \ POSTGRES_DB=app \ POSTGRES_USER=app \ POSTGRES_PASSWORD=pwd