Каталог vendor в Docker
Каталог vendor на хосте
пустой и затирает библиотеки,
которые Composer положил
в образ.
Том ./site:/var/www/html
подменяет весь корень сайта,
включая vendor
из слоя сборки.
В composer.json
задают имя пакета app
и пустой require:
{
"name": "app",
"require": {}
}
Dockerfile
копирует Composer,
ставит зависимости
и оставляет vendor
в образе:
FROM php:8.5-fpm
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
COPY composer.json /var/www/html/composer.json
WORKDIR /var/www/html
RUN composer install --no-interaction
Сценарий на диске
печатает hello:
<?php
echo 'hello';
Nginx передаёт сценарий
в FPM по имени app.
Файл default.conf:
server {
listen 80;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
У сервиса app
две строки в volumes:
код с ./site
и анонимный том
на /var/www/html/vendor.
Без второй строки
пустой vendor
с хоста скрывает каталог
из образа.
Nginx монтирует
только папку сайта.
Файл compose.yaml:
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./site:/var/www/html
- ./default.conf:/etc/nginx/conf.d/default.conf
app:
build: .
volumes:
- ./site:/var/www/html
- /var/www/html/vendor
Подъём с пересборкой
поднимет связку:
код с диска
и vendor
из образа в отдельном томе.
Запуск проекта:
docker compose up -d --build
Соберите сервис lib с установкой Composer в образе и двумя томами у PHP, чтобы vendor не затирался с хоста.
Откройте localhost:8080 и проверьте ответ hello.