执行drush updb后S3存储桶Image Style文件夹丢失求助(S3fs模块)
问题:S3fs模块环境下执行
drush updb后S3存储桶Image Style文件夹丢失 问题背景
在使用S3fs模块的Drupal环境中,执行drush updb(数据库更新)命令后,S3存储桶内的Image Style文件夹及其中的图片全部丢失。
操作流程
- 将UAT环境的Drupal从8.3版本升级至8.9版本
- 关联最新的生产环境脱敏数据库
- 执行
drush updb命令 - 命令执行成功后,发现生产环境S3存储桶中Image Style文件夹内的图片丢失
原因分析
核心问题出在Drupal 8.4+版本引入的Image Style清理逻辑与S3fs模块的兼容性冲突:当drush updb执行时,会触发image.path.flush钩子,这个钩子原本设计用于清理本地文件系统的Image Style缓存,但S3fs模块在处理该钩子时,错误地直接删除了S3存储桶中对应的Image Style文件夹,而非仅清理过时的缓存文件。
解决方案
1. 恢复丢失的图片
- 若有S3存储桶备份,直接从备份恢复Image Style文件夹
- 无备份的话,执行
drush image-flush --all命令,系统会重新为所有原始图片生成对应样式的缩略图并同步到S3
2. 避免后续执行drush updb时重复丢失
- 临时补丁法:找到S3fs模块中处理
image.path.flush或s3fs_file_delete的相关代码,注释掉直接删除S3文件夹的逻辑,改成仅清理过时缓存文件(可参考Drupal社区相关问题的修复思路) - 模块启停法:执行
drush updb前先卸载S3fs模块:drush pm-uninstall s3fs -y,完成更新后重新安装配置:drush pm-install s3fs -y,再同步Image Style缓存 - 跳过特定更新:如果明确是某个数据库更新项触发的问题,执行
drush updb --skip=更新项ID跳过该更新
3. 长期规避方案
- 升级S3fs模块到最新稳定版本,新版本一般已修复此类兼容性问题
- 保持Drupal核心与模块版本匹配,跨大版本升级前先确认各模块的兼容情况
内容的提问来源于stack exchange,提问作者Sunil Kansodiya
相关产品推荐
相关产品推荐

