You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker部署Laravel项目时MySQL容器root及普通用户连接失败问题排查求助

解决Docker化Laravel项目中MySQL容器连接失败的问题

我仔细看了你的配置、操作步骤和日志,很快定位到了几个核心问题,咱们一步步来解决:

1. 修复MySQL环境变量的冲突问题

在你的docker-compose.yml里,attendize_db服务的环境变量存在严重冲突:

environment:
  MYSQL_DATABASE: "preprodica"
  MYSQL_ROOT_PASSWORD: "Str0ngDBP@ssw0rd"
  MYSQL_USER: "dhia"
  MYSQL_PASSWORD: "dhia"
  MYSQL_ALLOW_EMPTY_PASSWORD: "yes"  # 这是导致连接失败的关键!

MySQL官方镜像的规则是:如果MYSQL_ALLOW_EMPTY_PASSWORD设为yes会直接忽略你设置的MYSQL_ROOT_PASSWORD,强制让root用户的密码为空。这就是你用Str0ngDBP@ssw0rd连接root失败的原因——实际上root密码是空的。

解决方法:

删除MYSQL_ALLOW_EMPTY_PASSWORD: "yes"这一行,或者把它改成MYSQL_ALLOW_EMPTY_PASSWORD: "no",确保MYSQL_ROOT_PASSWORD正常生效。修改后的环境变量如下:

environment:
  MYSQL_DATABASE: "preprodica"
  MYSQL_ROOT_PASSWORD: "Str0ngDBP@ssw0rd"
  MYSQL_USER: "dhia"
  MYSQL_PASSWORD: "dhia"

2. 清理旧的MySQL数据卷(必须执行的步骤)

你之前已经启动过容器,MySQL的数据卷./storage/db-data里已经保存了旧的用户配置(包括无密码的root用户),即使修改了环境变量,旧数据也会被复用,所以必须清理旧数据:

# 停止并删除容器,同时删除关联的数据卷
docker-compose down -v

# 重新构建并启动容器
docker-compose build && docker-compose up -d

3. 修正Laravel .env文件的数据库连接配置

你的项目.envDB_HOST=127.0.0.1是错误的——在Docker容器网络中,Laravel容器(attendize_app)不能用127.0.0.1访问MySQL容器,必须用服务名attendize_db

DB_CONNECTION=mysql
DB_HOST=attendize_db  # 这里改成容器服务名
DB_PORT=3306
DB_DATABASE=preprodica
DB_USERNAME=root
DB_PASSWORD=Str0ngDBP@ssw0rd

验证连接

现在你可以重新测试连接:

方法1:进入MySQL容器连接

docker exec -it ica-backoffice_attendize_db_1 /bin/bash
# 用设置的密码连接root用户
mysql -u root -pStr0ngDBP@ssw0rd
# 或者用普通用户dhia连接
mysql -u dhia -pdhia

方法2:从Laravel容器测试连接

docker exec -it ica-backoffice_attendize_app_1 php artisan tinker
# 在tinker里验证数据库连接
DB::connection()->getPdo();

额外说明

从你的MySQL日志里可以看到InnoDB: 数据库未正常关闭!,这说明之前的容器可能异常终止过,清理数据卷也能解决这个潜在的数据库损坏问题。

内容的提问来源于stack exchange,提问作者dhia

火山引擎 最新活动