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
相关产品推荐
相关产品推荐

