У розробці код зазвичай монтують з хоста: - .:/var/www/html. Разом із кодом у контейнер потрапляють і каталоги залежностей хоста - vendor і node_modules. Звідси три проблеми:
1. Різні платформи. На хості macOS (ARM чи x86), у контейнері - Linux. Нативні модулі npm (esbuild, rollup, sharp) і деякі Composer-пакети з бінарними файлами, встановлені на хості, у контейнері не запрацюють - і навпаки.
2. Продуктивність. vendor і node_modules - десятки тисяч дрібних файлів. На Docker Desktop (macOS, Windows) кожне читання через bind mount проходить через межу віртуальної машини - автозавантаження Composer і збирання фронтенду помітно сповільнюються.
3. Конфлікти. Залежності, встановлені в контейнері, перезаписують хостові (і навпаки) - нескінченне «а в мене працює».
Рішення - іменований том поверх каталогу залежностей:
services:
app:
build: .
volumes:
- .:/var/www/html # код з хоста
- vendor:/var/www/html/vendor # залежності - у томі Docker
- node_modules:/var/www/html/node_modules
volumes:
vendor:
node_modules:
Пізніше змонтований том «закриває» відповідний підкаталог bind mount: у контейнері vendor - з тому (Linux-версії, швидкий доступ), а на хості свій vendor (чи порожньо).
Що варто знати:
- встановлення залежностей - у контейнері:
docker compose run --rm app composer install,docker compose run --rm app npm ci; - IDE на хості не бачить залежностей з тому - автодоповнення й аналіз коду страждають. Варіанти: встановлювати й на хості теж, налаштувати IDE на віддалений інтерпретатор у контейнері, devcontainers;
- новий том порожній при першому створенні, але якщо в образі за цим шляхом уже є файли, Docker копіює їх у порожній том - зручно, якщо залежності встановлені при збиранні образу;
- оновлення залежностей: після зміни
composer.lockтом треба оновити (composer installзнову) - сам по собі він не «знає» про зміни; - скинути -
docker compose down -vвидаляє томи проєкту (разом з даними бази, якщо вони теж у томах!) - або видалити конкретний том:docker volume rm проєкт_vendor.
Альтернативи: docker compose watch з виключенням каталогів залежностей, синхронізовані файлові спільні каталоги Docker Desktop.