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

Ubuntu16.04下Docker部署Rails项目无法连接MySQL问题排查

解决Docker部署Rails项目时无法连接MySQL的问题

我来帮你排查这个连接问题——核心原因是你在Rails的数据库配置里用了本地socket或localhost,但Docker容器之间需要通过服务名来进行网络通信,而不是直接访问本地资源。下面是分步解决方法:

1. 修正database.yml配置

打开你的database.yml,把数据库连接的host改成docker-compose.yml里MySQL服务的名称(通常是mysql),同时移除socket相关配置,因为容器间用TCP连接而非本地socket。示例配置如下:

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV.fetch("MYSQL_ROOT_PASSWORD") { "your_root_password" } %>
  host: mysql # 关键:这里用docker-compose的MySQL服务名,不是localhost

development:
  <<: *default
  database: your_app_development

test:
  <<: *default
  database: your_app_test

注意:确保password和database名称与你docker-compose.yml里MySQL服务的环境变量一致。

2. 确认docker-compose.yml的MySQL服务配置

检查你的docker-compose.yml,确保MySQL服务设置了必要的环境变量,并且web服务依赖于它:

version: '3'
services:
  mysql:
    image: mysql:5.7 # 选择与你的Rails版本兼容的MySQL镜像
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password # 和database.yml里的密码一致
      MYSQL_DATABASE: your_app_development # 自动创建初始化数据库
    volumes:
      - mysql_data:/var/lib/mysql # 持久化数据库数据
    ports:
      - "3306:3306" # 可选:本地端口映射,方便外部工具连接

  web:
    build: .
    depends_on:
      - mysql # 确保web容器在mysql容器启动后再启动
    volumes:
      - .:/app # 挂载本地代码到容器
    environment:
      RAILS_ENV: development
      MYSQL_ROOT_PASSWORD: your_root_password # 传递密码给web容器
    ports:
      - "3000:3000"

volumes:
  mysql_data:

3. 验证容器间的网络连通性

有时候配置没问题,但容器间网络不通。你可以先启动MySQL容器,然后进入web容器测试连接:

  1. 停止所有容器:docker-compose down
  2. 启动MySQL容器:docker-compose up -d mysql
  3. 等待30秒左右(让MySQL服务完全启动),然后进入web容器:docker-compose run --rm web bash
  4. 在web容器里执行ping mysql,如果能收到响应,说明网络正常。也可以用telnet mysql 3306测试端口是否开放。

4. 处理MySQL启动延迟问题

MySQL容器启动后,服务可能需要几秒才能就绪,直接运行bin/setup会因连接超时失败。你可以添加一个等待脚本解决这个问题:

  • 在你的项目Dockerfile里安装wait-for-it工具:
RUN apt-get update && apt-get install -y wait-for-it
  • 修改docker-compose.yml里web服务的command,让它先等待MySQL就绪再执行setup:
command: sh -c "wait-for-it mysql:3306 -- bin/setup && rails s -b 0.0.0.0"

5. 重新执行setup

完成以上配置后,重新构建并运行setup:

docker-compose build
docker-compose run --rm web bin/setup

这样应该就能成功连接到MySQL容器了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:43:32