Docker-Compose部署Rails应用无法连接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

