升级Drupal 10.3.9至10.4.0时AWS Elastic Beanstalk部署Composer报错
问题核心
Drupal 10.4.0升级后,Composer尝试在/root/cache/vcs/目录下克隆s3fs模块的Git仓库,但AWS Elastic Beanstalk部署环境下该路径无写入权限,导致克隆失败。10.3.9版本未触发此问题,大概率是升级后Composer缓存路径配置变化,或s3fs模块版本约束自动切换到了需要Git克隆的开发分支。
可行解决办法
1. 强制指定Composer缓存到有权限的目录
AWS EB的应用目录(如/app或/var/app/staging)是部署用户有写入权限的路径,可通过以下方式修改Composer缓存路径:
方式一:修改composer.json配置
在composer.json的config节点中添加缓存目录配置:"config": { "cache-dir": "/app/composer-cache", "cache-repo-dir": "/app/composer-cache/repo" }提交修改后重新部署,Composer会自动创建该目录并使用它缓存依赖。
方式二:通过EB扩展设置环境变量
创建.ebextensions/composer-cache.config文件,内容如下:container_commands: 01_create_cache_dir: command: "mkdir -p /app/composer-cache && chown webapp:webapp /app/composer-cache" 02_set_composer_cache_var: command: "echo 'export COMPOSER_CACHE_DIR=/app/composer-cache' >> /etc/profile.d/composer.sh"这会在部署前创建缓存目录并设置环境变量,让Composer使用该路径。
2. 强制使用s3fs稳定版本而非开发分支
错误信息显示拉取的是s3fs dev-3.x分支,该分支需要Git克隆;稳定版本可直接下载压缩包,无需Git操作。修改composer.json的require节点,指定s3fs稳定版本:
"require": { "drupal/s3fs": "^3.0" }
执行composer update drupal/s3fs更新本地依赖后,重新打包部署即可。
3. 以webapp用户身份运行Composer
AWS EB默认可能以root用户运行Composer,但部分环境下root对/root目录的写入也受限制。通过EB扩展切换到webapp用户执行Composer命令:
创建.ebextensions/composer-run-as-webapp.config:
container_commands: 01_run_composer: command: "su - webapp -c 'cd /var/app/staging && composer install --no-dev --optimize-autoloader'" leader_only: true
4. 禁用Composer缓存
如果不需要缓存,可直接在部署命令中禁用缓存,避免创建缓存目录的操作:
在EB扩展或部署脚本中使用以下Composer命令:
composer install --no-dev --optimize-autoloader --no-cache
内容的提问来源于stack exchange,提问作者Fabrice Lefloch

