Lokális gép, openSUSE, fejlesztői környezetet szeretnénk Laravelhez. Telepítsük a dockert és a docker-compose-t, ha még nem voltak.

Klónoztuk a Laravel-projektünket, de giten kívül nincs más telepítve, se db, se php. Először is szükségünk lesz egy minimál image-re composer és php parancsok futtatásához. Ennek php verziója egyezzen az app által használttal. Itt összevontuk a 3 szükséges init parancsot:

$ cd myproject
$ docker run --rm \
    -u (id -u):(id -g) \
    -v (pwd):/opt \
    -w /opt \
    laravelsail/php74-composer:latest \
    bash -c "composer require --dev laravel/sail && composer install && php artisan sail:install --with=mariadb"

Létrejött a docker-compose.yml konfig, szerkesszük, ha kell. Részletek erről a konfigról, ha kézzel állítjuk össze, ajánlott olvasmányok:

Például PHP 7.4 és MariaDB 10.5 környezet, mint a Debian 11-ben (webszervernek itt a php beépített szerverét használjuk, annak nincs jelentősége):

version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/7.4
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-7.4/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mariadb
    mariadb:
        image: 'mariadb:10.5'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: "%"
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sail-mariadb:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sail-mariadb:
        driver: local

Fontos: a Laravel-projekt .env konfigjában a DB_HOST paraméter legyen a docker-compose-beli db-szolgáltatás neve, ami itt mariadb, az APP_URL pedig legyen http://localhost.

APP_NAME=Myapp
APP_ENV=local
APP_KEY=base64:xkvn6VLT8Sw7Dq1m+tkngJz/iODw+m+a+pu9RW3ynQI=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
DB_DATABASE=mydb
DB_USERNAME=myuser

A shellben csináljunk egy sail aliast erre: ./vendor/bin/sail. A projektmappában kiadott sail up parancs után az app máris működik a http://localhost címen.

$ cd myproject
$ sail up -d
$ sail php -v
$ sail node -v
$ sail npm i
$ sail artisan key:gen
$ sail tinker
$ sail shell

Így húzhatunk be sql dumpot (a db jelszó üres, lokál környezetben vagyunk):

$ docker-compose exec -T mariadb mysql -umyuser mydb < database/dump.sql

Ha végeztünk a melóval, akár le is állíthatunk mindent.

$ sail down
# systemctl stop docker

PHPStorm

Állítsuk be az interpretert: a File > Settings > Languages & Frameworks > PHP panelen a CLI interpreter-nél ..., majd +, majd From Docker, Vagrant.... Itt válasszuk a Docker Compose opciót, majd állítsuk be a Server és a Service mezőket. A Lifecycle-nél válasszuk a Connect to existing container opciót. Ez kész.

Laravel 8-nál downgrade-eljük a PHPUnitot 9-ről 8-ra, mert még 19.2 PHPStormot használunk (hja, drága a licenc), amely nem támogatja a 9-est, el sem indul a teszt. A File > Settings > Languages & Frameworks > PHP > Test Frameworks panelen +, majd PHPUnit by remote interpreter, majd válasszuk ki az előbb hozzáadott interpretert. Kész, működik a shift + F10.