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

Docker容器内MariaDB数据库连接失败(账号密码正确)

问题:Ubuntu下Docker容器内无法连接MariaDB数据库(MacOS环境正常)

配置文件信息

docker-compose.yml 内容

version: "3"
services:
  mariadb:
    container_name: db
    image: mariadb:latest
    env_file:
      - .env
    environment:
      MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
    - mariadb-travian:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - travian-network
volumes:
  mariadb-travian:
networks:
  travian-network:

.env 文件内容

DB_HOST=mariadb
DB_PORT=3306
MYSQL_DATABASE=mardiadb-travian
MYSQL_PASSWORD=TAQ59WqPeoGOTFv
ROOT_PASSWORD=CvlLpyqyeAzTg6V
MYSQL_USER=admin
MYSQL_VERSION=10.5.0
DATABASE_URL="mysql://admin:TAQ59WqPeoGOTFv@mariadb:3306/mardiadb-travian?serverVersion=mariadb-10.5.0"

错误现象

执行docker-compose up后服务运行正常,但进入容器内连接数据库失败:

docker exec -it db bash
mysql -u admin -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'admin'@'localhost' (using password: YES)

补充:该配置在MacOS系统下可正常连接,仅Ubuntu系统出现此问题。


解决方案

1. 清理持久化卷数据(最可能解决问题)

Ubuntu和MacOS的Docker卷存储机制存在差异,旧卷可能残留了之前的用户权限配置,导致新创建的admin用户未生效:

  • 停止并删除容器及关联卷:
    docker-compose down -v
    
  • 重新启动容器:
    docker-compose up -d
    
  • 再次尝试连接数据库:
    docker exec -it db mysql -u admin -p
    

2. 指定连接主机

MariaDB的用户权限与登录主机绑定,admin用户可能仅被允许从%(任意主机)或mariadb主机连接,而非localhost:
尝试指定主机连接:

docker exec -it db mysql -u admin -p -h mariadb

或者:

docker exec -it db mysql -u admin -p -h 127.0.0.1

3. 调整环境变量加载方式

docker-compose中同时使用env_file和environment可能导致变量覆盖,建议仅保留env_file配置:
修改后的docker-compose.yml:

version: "3"
services:
  mariadb:
    container_name: db
    image: mariadb:latest
    env_file:
      - .env
    volumes:
    - mariadb-travian:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - travian-network
volumes:
  mariadb-travian:
networks:
  travian-network:

修改后重启容器再测试连接。

4. 用root用户检查并修改权限

如果以上方法无效,先以root用户登录数据库查看权限配置:

  • 登录root用户:
    docker exec -it db mysql -u root -p
    
    输入.env文件中的ROOT_PASSWORD值(CvlLpyqyeAzTg6V)
  • 查询用户权限:
    SELECT user, host FROM mysql.user;
    
  • 如果admin用户的host不是localhost,添加对应权限:
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'TAQ59WqPeoGOTFv';
    FLUSH PRIVILEGES;
    
  • 退出root后,再用admin用户连接localhost即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:32:11