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

Docker-Compose部署Rails应用无法连接MySQL容器求助

解决Rails + Docker Compose MySQL连接拒绝的问题

嘿,刚看完你的问题,咱们一步步来搞定这个MySQL连接拒绝的坑:

1. 删掉MySQL容器里多余的MYSQL_HOST环境变量

先看你的docker-compose.yml里的db服务,你加了MYSQL_HOST: 'localhost',但这个不是MySQL官方镜像的合法配置项!MySQL默认会绑定容器的所有网卡,这样其他容器才能访问它,你加了这个变量反而会让MySQL只绑定容器内部的localhost,导致web容器根本连不上。直接把这行删掉就行:

# 把这行从db的environment里移除
MYSQL_HOST: 'localhost'

2. 移除database.yml里的socket配置

你的database.yml里写了socket: /var/run/mysqld/mysqld.sock,但在Docker环境下,web容器和db容器是通过网络通信的,根本用不上本地socket。这个配置会让Rails傻呵呵地在自己容器里找socket文件,肯定找不到啊!把这一行删掉:

development:
  adapter: mysql2
  encoding: utf8
  database: online_community_development
  pool: 5
  username: root
  password: slumland
  host: db # 这个是对的,指向docker-compose里的db服务名
  # 删掉socket那一行

3. 等MySQL容器完全就绪再执行数据库命令

depends_on只是保证web容器在db容器之后启动,但不保证MySQL服务已经完全启动好(MySQL启动需要一点时间)。作为新手,最简单的方法是先手动等一等:

# 先启动db容器
docker-compose up -d db
# 等个10-20秒,让MySQL完全启动
# 然后再执行数据库初始化命令
docker-compose run web rake db:create db:migrate
# 最后启动所有服务
docker-compose up -d

你也可以用docker-compose ps查看db容器的状态,确保它是Up状态再执行命令。

4. 核对密码是否一致!

注意你的docker-compose.yml里db的MYSQL_ROOT_PASSWORD是******,而database.yml里的password是slumland,这两个必须完全一样!如果密码不匹配,肯定连不上,这个细节很容易被忽略,一定要检查清楚。

做完这些修改后,重新build容器(docker-compose build),再按上面的步骤操作,应该就能顺利创建并迁移数据库了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:50:27