如何从Rails应用连接Docker化MySQL容器?
解决Rails连接容器化MySQL的问题
1. 先搞懂Docker网络逻辑
别用127.0.0.1当数据库host——在Rails容器里,127.0.0.1指的是容器自己,不是MySQL容器。只要Rails和MySQL服务在同一个docker-compose文件里,直接用compose里定义的服务名db当host就行,Docker会自动通过内部网络解析到MySQL容器。
2. 核对配置的一致性
检查docker-compose.yml的MySQL环境变量
确保你在MySQL服务里配置了正确的用户、密码和数据库,这些会在容器首次启动时自动初始化:
services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 你的root密码 MYSQL_DATABASE: paperclip_db MYSQL_USER: paperclip_user MYSQL_PASSWORD: 你的用户密码
修正database.yml配置
把host改成db,同时保证用户名、密码、数据库名和上面的配置完全一致:
default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: paperclip_user password: 你的用户密码 # 和docker-compose里的MYSQL_PASSWORD完全匹配 host: db # 用compose服务名,别瞎填其他值 development: <<: *default database: paperclip_db
3. 排查认证失败的深层原因
如果用db当host还是报密码错误,进MySQL容器查用户权限:
docker exec -it 你的mysql容器名 mysql -u root -p # 输入root密码后执行 SELECT user, host FROM mysql.user WHERE user = 'paperclip_user';
- 要是
host列显示的是localhost,说明这个用户只能在MySQL容器内部连接,得改成允许外部(Docker内部网络)连接:ALTER USER 'paperclip_user'@'%' IDENTIFIED BY '你的用户密码'; FLUSH PRIVILEGES; - 如果用的是MySQL 8.0,还要在database.yml里加一行认证配置,因为8.0默认用的
caching_sha2_password驱动可能不兼容Rails的mysql2 gem:default: &default # ...其他配置 default:mysql_native_password
4. 确保MySQL先启动就绪
在docker-compose.yml里给Rails服务加depends_on,同时给MySQL加健康检查,避免Rails启动时MySQL还没准备好:
services: web: build: . depends_on: db: condition: service_healthy # ...其他Rails配置 db: image: mysql:8.0 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 # ...其他MySQL配置
内容的提问来源于stack exchange,提问作者wubbalubba
相关产品推荐
相关产品推荐

