使用php:7-fpm镜像执行composer install/update后依赖未生效
我之前在php:7-fpm镜像部署时也踩过类似的坑,看着控制台有安装记录但依赖就是不生效,大概率是脚本里几个细节没处理好,咱们一步步来修复:
1. 确保Composer全局可访问
你用./install-composer.sh安装的Composer可能只在当前目录可用,而且如果脚本没把它加到系统PATH里,后续执行composer install时可能会因为环境变量问题导致依赖安装不完整。建议直接用官方的全局安装命令替换掉./install-composer.sh:
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
这样Composer就会被装到/usr/local/bin,全局任何目录都能直接调用。
2. 确认在项目根目录执行Composer
如果composer install不是在包含composer.json的项目根目录执行,Composer根本找不到依赖配置文件,自然不会安装任何依赖。一定要在执行前切换到项目目录,比如:
cd /var/www/html # 替换成你实际的项目挂载路径
3. 处理权限问题
php:7-fpm镜像默认用www-data用户运行,但脚本里如果用root执行composer install,生成的vendor目录权限会是root所有,后续应用运行时www-data用户无法读取这些依赖,就会出现“依赖未识别”的假象。可以切换用户执行Composer:
su www-data -c "composer install --no-interaction"
或者安装完成后手动调整权限:
chown -R www-data:www-data vendor/
4. 确保扩展真的安装成功
你安装mcrypt和pdo_mysql的命令可能存在隐患——php7.2及以后的版本里,mcrypt已经从核心扩展移到了PECL,用docker-php-ext-install可能装不上。可以换成PECL安装并启用的方式:
pecl install mcrypt-1.0.4 && docker-php-ext-enable mcrypt
另外可以加一句验证命令,确认扩展是否真的生效:
php -m | grep -E "mcrypt|pdo_mysql"
如果没有输出,说明扩展没装上,依赖里需要这些扩展的包自然会识别失败。
修复后的完整脚本
把这些调整整合后,你的脚本应该是这样的:
script: - apt-get update && apt-get install -y unzip python-dev git curl libmcrypt-dev mysql-client software-properties-common gnupg - pecl install mcrypt-1.0.4 && docker-php-ext-enable mcrypt - docker-php-ext-install pdo_mysql - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - cd /var/www/html # 替换为你的项目实际路径 - su www-data -c "composer install --no-interaction --optimize-autoloader"
按这个脚本执行后,应该就能解决依赖无法识别的问题了。
内容的提问来源于stack exchange,提问作者thitami

