Docker Compose部署Rails测试环境遇MySQL root用户访问拒绝错误
解决Docker Compose环境下Rails连接MySQL的Access Denied错误
嘿,这个数据库连接权限的问题我之前在Docker环境里踩过坑,咱们来一步步解决它:
错误根源分析
你看到的 Docker Access Denied for user 'root'@'172.28.1.5' (using Password: NO) 错误,核心问题是Rails容器在连接MySQL时没有传递密码,或者MySQL容器的root密码没有正确配置。结合你的Docker Compose配置来看,首先能发现MySQL服务的环境变量写得不完整。
具体修复步骤
1. 补全MySQL容器的环境变量配置
你的db服务里的MYSQL_ROOT_PASSW...是不完整的,MySQL官方镜像要求用MYSQL_ROOT_PASSWORD来设置root用户的密码。修改你的docker-compose.yml:
version: '2' services: railsdev: build: ./ image: railsdev depends_on: - db ports: - 8080:8080 networks: testing_net: ipv4_address: 172.28.1.5 volumes: - /c/Users/my_user/Documents/directory:/mount_dir db: build: ./mysql image: mysqldev ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: your_strong_root_password # 替换成你要设置的密码
注意:这里必须设置一个有效的密码,不能省略或简写变量名。
2. 检查Rails的数据库配置文件
确保你的Rails项目config/database.yml中,对应的环境(比如development)配置里包含正确的密码,并且连接主机配置正确:
development: adapter: mysql2 encoding: utf8mb4 database: your_app_name_development # 替换成你的应用数据库名 username: root password: your_strong_root_password # 和上面Docker Compose里的密码保持一致 host: db # 直接用Docker Compose的服务名即可,不用固定IP也能连通 port: 3306
如果你坚持要用固定IP172.28.1.5,把host改成这个IP就行,但要确保MySQL允许root从这个IP访问(MySQL默认root允许所有IP访问,除非你自定义了权限)。
3. 清理旧容器与缓存,重新构建
旧的容器缓存或卷数据可能导致配置不生效,执行以下命令彻底清理后重新启动:
# 停止并删除容器、卷和网络 docker-compose down -v # 不带缓存重新构建镜像 docker-compose build --no-cache # 启动服务 docker-compose up
4. 验证MySQL用户权限(可选)
如果还是有问题,可以进入MySQL容器检查root用户的访问权限:
# 进入MySQL容器 docker-compose exec db mysql -uroot -pyour_strong_root_password # 查询用户权限 SELECT user, host FROM mysql.user;
确保root用户的host字段是%(允许所有IP访问)或者172.28.1.5(仅允许Rails容器的IP访问)。
内容的提问来源于stack exchange,提问作者jpruee
相关产品推荐
相关产品推荐

