Laravel 9项目数据库连接异常:错误调用mariadb作为主机名
问题排查与解决方案
核心矛盾
容器内执行Artisan命令可正常连接mysql容器,但HTTP请求时却尝试解析mariadb主机名,导致数据库连接失败。
可能原因及解决步骤
1. Bitnami Laravel镜像的默认环境变量覆盖
Bitnami官方的Laravel镜像默认会设置数据库相关环境变量,其中DB_HOST默认值为mariadb,优先级高于本地.env文件。
验证:进入web容器查看环境变量:
docker-compose exec web printenv | grep DB_
若输出中DB_HOST=mariadb,则确认是此问题。
解决:在docker-compose.yml的web服务中显式声明环境变量,强制覆盖默认值:
services: web: # ...其他配置 environment: - DB_HOST=mysql - DB_CONNECTION=mysql - DB_DATABASE=url_shortener - DB_USERNAME=root - DB_PASSWORD=***
2. 配置缓存残留
即使手动执行过config:clear,容器启动时可能加载了旧的配置缓存,导致HTTP请求时使用错误的主机名。
解决:修改docker-compose.yml的web服务命令,先清理缓存再启动服务:
services: web: # ...其他配置 command: sh -c "php artisan config:clear && php artisan serve --host=0.0.0.0 --port=7999"
3. 确认.env文件的有效性
检查容器内的.env是否正确挂载且内容无误:
docker-compose exec web cat /app/src/.env | grep DB_
若内容与本地不符,检查docker-compose.yml的挂载配置,确保./:/app挂载正确,本地src/.env未被覆盖。
4. 排查代码中的硬编码
全局搜索项目中是否存在mariadb字符串,排查是否有硬编码的数据库主机配置:
# 本地项目目录执行 grep -r "mariadb" ./src --include="*.php" --include="*.env*" --include="*.json" # 或进入容器执行 docker-compose exec web grep -r "mariadb" /app/src --include="*.php" --include="*.env*" --include="*.json"
内容的提问来源于stack exchange,提问作者talaman
相关产品推荐
相关产品推荐

