Bind mount (volumes: - .:/var/www/html) робить каталог хоста видимим у контейнері напряму: зміна файлу на хості миттєво видна в контейнері.
docker compose watch (Compose 2.22+) - інший підхід: Compose стежить за файлами на хості й при змінах виконує дію з контейнером.
services:
app:
build: .
develop:
watch:
- action: sync # скопіювати змінені файли в контейнер
path: ./app
target: /var/www/html/app
- action: sync+restart # скопіювати й перезапустити сервіс
path: ./config
target: /var/www/html/config
- action: rebuild # перезібрати образ і перестворити контейнер
path: composer.lock
- action: sync
path: ./resources
target: /var/www/html/resources
ignore:
- node_modules/
docker compose watch # або docker compose up --watch
Дії:
sync- копіює змінені файли в контейнер (для коду, що підхоплюється «на льоту»: PHP, шаблони, фронтенд з HMR);sync+restart- копіює й перезапускає основний процес (змінилася конфігурація);sync+exec- копіює й виконує команду в контейнері;rebuild- перезбирає образ (змінилися залежності:composer.lock,package.json,Dockerfile).
Чим відрізняється від bind mount:
- синхронізація лише потрібних каталогів, з виключеннями -
vendor,node_modulesі кеші не синхронізуються, у контейнері лишаються свої версії, зібрані для Linux; - продуктивність на macOS і Windows: bind mount через віртуальну машину Docker Desktop повільний на великих кодових базах; watch копіює лише змінені файли, а читання в контейнері йде з його власної файлової системи;
- права й власники файлів - менше проблем, ніж зі спільними каталогами;
- автоматичний rebuild при зміні залежностей - не треба пам'ятати про
--build.
Обмеження:
- зміни з контейнера назад на хост не синхронізуються (згенеровані файли, міграції, створені командою
artisan make:*) - для таких робочих процесів bind mount зручніший; - потрібен
buildу конфігурації сервісу (watch працює з сервісами, які Compose збирає).
Для Laravel-розробки часто поєднують: bind mount для каталогів, де генеруються файли, і watch - для залежностей з rebuild.