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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:47