# Development Dockerfile with FrankenPHP FROM dunglas/frankenphp:latest-php8.3-alpine # Install system dependencies RUN apk add --no-cache \ git \ postgresql-client \ vim \ bash \ nano \ curl # Install Node.js 20.19.0+ from unofficial builds (for Vite 7 compatibility) RUN curl -fsSL https://unofficial-builds.nodejs.org/download/release/v20.19.0/node-v20.19.0-linux-x64-musl.tar.xz | tar -xJ -C /usr/local --strip-components=1 # Install PHP extensions including xdebug for development RUN install-php-extensions \ pdo_pgsql \ opcache \ zip \ gd \ intl \ redis \ xdebug # Install Composer COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Set working directory WORKDIR /app # Configure PHP for development RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" # Configure Xdebug (disabled by default to reduce noise) RUN echo "xdebug.mode=off" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo ";xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo ";xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo ";xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini # Configure Caddy for development RUN cat > /etc/caddy/Caddyfile < /start.sh <<'EOF' #!/bin/sh set -e # Create .env file if it doesn't exist if [ ! -f ".env" ]; then echo "Creating .env file from .env.example..." cp .env.example .env fi # Install composer dependencies if vendor is empty if [ ! -f "vendor/autoload.php" ]; then echo "Installing Composer dependencies..." composer install --no-interaction fi # Install npm dependencies if node_modules is empty if [ ! -d "node_modules" ] && [ -f "package.json" ]; then echo "Installing npm dependencies..." npm install fi # Clear Laravel caches php artisan config:clear || true php artisan cache:clear || true # Wait for database echo "Waiting for database..." until pg_isready -h db -U trove -q; do echo "Database not ready, retrying..." sleep 2 done echo "Database is ready!" # Generate app key if not set if grep -q "^APP_KEY=$" .env 2>/dev/null; then echo "Generating application key..." php artisan key:generate fi # Run migrations php artisan migrate --force # Start Vite dev server in background (if package.json exists) if [ -f "package.json" ]; then npm run dev & fi # Start FrankenPHP exec frankenphp run --config /etc/caddy/Caddyfile EOF RUN chmod +x /start.sh # Expose ports EXPOSE 8000 5173 # Use the startup script CMD ["/start.sh"]