You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:50:11