Laravel+Docker环境下MariaDB 1130连接错误解决求助
解决Docker Compose部署MariaDB时root用户无法跨容器连接的问题
问题根源
你已经在docker-compose的db服务里配置了MYSQL_ROOT_HOST="%"和MYSQL_ALLOW_EMPTY_PASSWORD=yes,但数据库用户表里没有root@%这条记录——这是因为本地挂载的./db/数据卷已经保存了首次初始化后的旧数据。MariaDB的初始化环境变量(比如MYSQL_ROOT_HOST)只在容器第一次启动、数据目录为空时才会生效,后续启动会直接复用已有数据,不会重新执行用户初始化逻辑。
两种无手动改库的解决方案
方案1:清空旧数据,重新初始化(适合全新开发环境)
- 停掉并删除db容器:
docker-compose stop db docker-compose rm -f db - 删除本地的
./db/目录(如果不需要旧数据的话,记得提前备份):rm -rf ./db/ - 重新启动db服务:
这次容器启动时,因为数据目录是空的,会自动执行初始化脚本,按照你设置的环境变量创建docker-compose up -d dbroot@%用户。
方案2:挂载初始化脚本(保留现有数据)
如果要保留现有数据库里的数据,就通过挂载初始化SQL脚本让容器自动执行授权操作:
- 在项目根目录新建
init文件夹,里面创建allow-root-access.sql文件,内容如下:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES; - 修改docker-compose.yml里的db服务,添加初始化脚本的挂载:
db: image: mariadb container_name: docker-mariadb restart: unless-stopped tty: true environment: MYSQL_DATABASE: docker-db MYSQL_ROOT_HOST: "%" MYSQL_ALLOW_EMPTY_PASSWORD: yes volumes: - ./db/:/var/lib/mysql/ - ./init/:/docker-entrypoint-initdb.d/ # 新增挂载初始化脚本目录 networks: - docker-network - 重启db容器:
MariaDB容器启动时会自动执行docker-compose restart db/docker-entrypoint-initdb.d/下的所有SQL脚本,完成root@%用户的授权。
验证方法
重启后,执行下面的命令查看用户列表:
docker exec -it docker-mariadb mysql -u root -e "SELECT user, host FROM mysql.user;"
如果输出里有root | %的条目,说明配置生效,Laravel应用就能正常连接数据库了。
内容的提问来源于stack exchange,提问作者realtebo
相关产品推荐
相关产品推荐

