Laravel通过CodeCommit部署到Elastic Beanstalk时storage:link路径异常如何解决
问题原因
Elastic Beanstalk 执行 container_commands 阶段时,应用代码还存放在临时部署目录 /var/app/staging 中,此时直接运行 php artisan storage:link 生成的软链接会绑定 staging 目录下的 storage 路径。部署完成后代码会被移动到正式运行目录 /var/app/current,因此会出现软链接指向路径不符合预期的问题。
解决方案
你可以选择以下任意一种方案修复该问题:
方案1:修改 .ebextensions 配置,直接指定软链接路径
将原来的 artisan 命令替换为手动创建软链接的 ln 命令,直接指定正确的目标路径,修改后的 init.config 内容如下:
// init.config inside .ebextensions container_commands: 01storagelink: command: "ln -sf /var/app/current/storage/app/public /var/app/staging/public/storage"
参数说明:
-sf表示强制覆盖已存在的软链接,避免部署时报文件已存在的错误- 也可以使用 Elastic Beanstalk 内置的环境变量替代硬编码路径,兼容性更强:
command: "ln -sf $EB_APP_CURRENT_DIR/storage/app/public $EB_APP_STAGING_DIR/public/storage"
方案2:使用部署后钩子执行原生 storage:link 命令
对于 Amazon Linux 2 版本的 Elastic Beanstalk 平台,推荐使用官方提供的 postdeploy 钩子,在代码完全部署到正式目录后再执行命令,操作步骤如下:
- 在项目根目录创建层级目录
.platform/hooks/postdeploy/ - 在该目录下新建脚本文件
01_create_storage_link.sh,写入以下内容:#!/bin/bash cd /var/app/current php artisan storage:link - 为脚本添加可执行权限(本地执行该命令后再提交代码):
chmod +x .platform/hooks/postdeploy/01_create_storage_link.sh
该方案完全复用 Laravel 原生的 storage 链接生成逻辑,无需手动维护路径,适配性更强。
内容的提问来源于stack exchange,提问作者Adem Tepe
相关产品推荐
相关产品推荐

