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

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:清空旧数据,重新初始化(适合全新开发环境)

  1. 停掉并删除db容器:
    docker-compose stop db
    docker-compose rm -f db
    
  2. 删除本地的./db/目录(如果不需要旧数据的话,记得提前备份):
    rm -rf ./db/
    
  3. 重新启动db服务:
    docker-compose up -d db
    
    这次容器启动时,因为数据目录是空的,会自动执行初始化脚本,按照你设置的环境变量创建root@%用户。

方案2:挂载初始化脚本(保留现有数据)

如果要保留现有数据库里的数据,就通过挂载初始化SQL脚本让容器自动执行授权操作:

  1. 在项目根目录新建init文件夹,里面创建allow-root-access.sql文件,内容如下:
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  2. 修改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
    
  3. 重启db容器:
    docker-compose restart db
    
    MariaDB容器启动时会自动执行/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:35:14