Elastic Beanstalk容器命令迁移无效,SSH登录EC2执行正常的问题
Elastic Beanstalk中container_commands执行migrate无效果但SSH执行成功的排查方案
1. 环境变量未加载导致数据库配置错误
EB的container_commands阶段默认不会加载控制台设置的环境变量,而SSH登录后这些变量会自动加载。如果你的Django数据库配置依赖这些环境变量(比如DATABASE_URL),就会导致migrate时连接的数据库不是目标RDS,自然看不到未完成的迁移。
解决办法:在命令开头先加载EB的环境变量文件:
container_commands: 01_migrate: command: "source /opt/elasticbeanstalk/deployment/env && source /var/app/venv/*/bin/activate && python3 /var/app/current/python/manage.py migrate --noinput" leader_only: true
2. 工作目录不正确导致路径问题
container_commands默认工作目录不是Django项目根目录,执行manage.py时可能因为相对路径问题找不到正确的settings模块,或者读取不到迁移文件。
解决办法:指定cwd参数切换到manage.py所在目录,同时简化命令:
container_commands: 01_migrate: command: "source /opt/elasticbeanstalk/deployment/env && source /var/app/venv/*/bin/activate && python3 manage.py migrate --noinput" leader_only: true cwd: /var/app/current/python
3. 虚拟环境Python与系统Python混淆
命令中使用python3可能调用的是系统默认Python,而非虚拟环境中的Python,导致依赖包(比如MySQL驱动)未正确加载,或者使用了错误的Django配置。
解决办法:直接调用虚拟环境中的Python路径:
container_commands: 01_migrate: command: "source /opt/elasticbeanstalk/deployment/env && /var/app/venv/*/bin/python manage.py migrate --noinput" leader_only: true cwd: /var/app/current/python
4. 添加调试命令排查差异
如果以上方法无效,可以在migrate前添加调试命令,对比container_commands执行环境和SSH环境的差异:
container_commands: 00_debug: command: "pwd && env | grep DATABASE && ls -la /var/app/current/python/migrations" leader_only: true 01_migrate: command: "source /opt/elasticbeanstalk/deployment/env && source /var/app/venv/*/bin/activate && python3 manage.py migrate --noinput" leader_only: true cwd: /var/app/current/python
查看部署日志中的调试输出,重点对比:
- 当前工作目录(
pwd)是否和SSH时一致 - 数据库相关环境变量(
env | grep DATABASE)是否正确 - 迁移文件目录(
ls -la .../migrations)是否存在文件且权限正常
内容的提问来源于stack exchange,提问作者lambooties
相关产品推荐
相关产品推荐

