Я столкнулся с довольно странной проблемой, связанной с Docker Composer.Дело в том, что Composer, работающий на разных версиях PHP, устанавливает разные версии исходников.В моем конкретном случае для проекта composer.json
требуется "doctrine/orm":"2.5"
, который в свою очередь объявляется как PHP 5-совместимый .И если я запускаю composer install
на локальном интерпретаторе CLI PHP 7, он устанавливает версию дерева кода, совместимую только с PHP7, и я получаю много E_PARSE, поскольку код Doctrine имеет модификаторы видимости констант класса и типы возвращаемых функций.Если я запускаю composer install
внутри моего php:5-apache-jessie
контейнера, все в порядке (за исключением некоторых проблем ниже), и проект успешно выполняется.
Итак, кажется, нам не следует использовать локальный интерпретатор, чтобы иметь правильные источники в проекте.Давайте запустим composer внутри контейнера.Когда я запускаю его вручную, появляется предупреждение о том, что Composer не запускается от имени пользователя root, и у нас есть корневой каталог, который не годится.Если мы выполняем exec в контейнер, мы все равно не можем запустить что-то вроде sudo -u www-data -c 'composer install'
, так как www-data
пользователь не имеет логина.Я не могу просто добавить RUN composer install
, так как у меня нет смонтированного тома в данный момент при создании образа при запуске с docker-compose
.
Я думаю, в идеальной ситуации мы могли бы запускать все команды контейнера как пользователь хоста.Но когда я попытался использовать директиву USER
в Dockerfile, установив ее в свой UID, контейнер просто даже не запустился.
Итак, возникает вопрос: какой рабочий процесс нужно использовать, чтобы иметь правильный (средства, связанные сфактическая среда сервера) версия зависимостей Composer при запуске проекта PHP внутри контейнера Docker?