Docker容器内Ruby脚本无法连接远程MySQL数据库求助
问题描述
我将Ruby脚本部署到Docker容器后,无法连接远程在线MySQL数据库,但未容器化时连接正常。尝试将数据库绑定地址从127.0.0.1改为0.0.0.0后问题依旧,容器运行后以退出码0结束,未建立数据库连接。
相关配置如下:
Dockerfile
FROM ruby:3.2.2 RUN apt-get update -qq && apt-get install -y build-essential WORKDIR home/docker ADD Gemfile home/docker/Gemfile ADD Gemfile.lock home/docker/Gemfile.lock COPY Gemfile /home/dir_project/Gemfile COPY Gemfile.lock /home/dir_project/Gemfile.lock ADD . /home/docker RUN bundle install
mysqld.cnf(数据库端配置)
bind-address = 172.17.0.1 (this is a docker Host IP) mysqlx-bind-address = 172.17.0.1
database.yml(Ruby脚本配置)
development: adapter: mysql12 username:.... password:.... host:172.17.0.1 database: my_db port: 3307
尝试过的SSH隧道命令
ssh -L 3307:172.17.0.1:3306 ... (and link to db)
排查与解决步骤
1. 修正数据库适配器错误
database.yml中adapter: mysql12是错误写法,Ruby连接MySQL的标准适配器为mysql2,修改后配置如下:
development: adapter: mysql2 username: your_username password: your_password host: 172.17.0.1 database: my_db port: 3307
2. 修正Dockerfile路径问题
Dockerfile中WORKDIR缺少根目录符号/,且存在重复拷贝Gemfile到不同目录的混乱,统一修改为:
FROM ruby:3.2.2 RUN apt-get update -qq && apt-get install -y build-essential WORKDIR /home/dir_project COPY Gemfile Gemfile.lock ./ RUN bundle install COPY . .
确保所有文件统一在工作目录下,避免脚本找不到配置文件。
3. 调整SSH隧道配置
若通过SSH隧道转发远程数据库,需将端口绑定到宿主机所有网卡(而非仅127.0.0.1),让容器可访问:
ssh -L 0.0.0.0:3307:<远程数据库IP>:3306 <SSH用户名>@<SSH服务器IP>
4. 检查MySQL用户权限
远程数据库用户需允许Docker容器所在IP段(如172.17.0.0/16)访问,或临时开放全局访问(生产环境谨慎使用):
GRANT ALL ON my_db.* TO 'your_username'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;
5. 测试容器网络连通性
启动容器后进入内部,测试网络是否正常:
# 进入容器 docker exec -it <容器ID/名称> bash # ping宿主机IP验证连通性 ping 172.17.0.1 # 测试端口是否可访问 telnet 172.17.0.1 3307
若ping不通检查Docker网络模式,telnet不通则排查宿主机防火墙或隧道是否正常。
6. 查看容器日志定位具体错误
退出码0不代表执行成功,通过日志获取连接失败细节:
docker logs <容器ID/名称>
日志会明确显示错误原因(如权限不足、连接超时、适配器错误等),再针对性解决。
内容的提问来源于stack exchange,提问作者YasuoPlayer
相关产品推荐
相关产品推荐

