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

Docker-compose集成Redis、Sidekiq到Rails出现SocketError如何解决?

问题排查与解决方案

下面是按出现概率从高到低排列的排查方案:

1. 检查锚点*common-settings的网络配置

你配置中的web服务继承了<<: *common-settings,但redis和sidekiq服务没有继承该配置,大概率是这里的问题:

  • 如果*common-settings中指定了自定义networks配置,那么web服务运行在自定义网络下,redis、sidekiq运行在compose默认网络下,网络隔离导致无法通信
  • 修复方案:要么给redis、sidekiq也加上和web一致的networks配置,要么删除*common-settings中的自定义网络配置,让所有服务都跑在默认网络下
  • 额外检查:如果*common-settings中配置了network_mode: host,那么web服务会使用宿主机网络,无法通过服务名redis访问其他容器,此时可以删除该配置,或者将sidekiq的redis地址改为redis://localhost:6379/12

2. 验证容器网络归属

执行以下命令确认三个服务是否在同一个网络下:

# 查看compose项目对应的网络,一般为「项目名_default」
docker network ls
# 检查网络下的容器列表
docker network inspect <你的网络名>

如果web/sidekiq/redis有任意一个不在该网络下,补充对应服务的networks配置即可。

3. 检查Redis服务的监听配置

默认的Redis镜像会绑定0.0.0.0,但不排除有自定义配置的情况,进入Redis容器执行命令验证:

docker-compose exec redis redis-cli config get bind

如果返回值为127.0.0.1,说明Redis只允许容器内部访问,给redis服务补充启动命令即可:

redis:
  image: 'redis:5-alpine'
  command: redis-server --bind 0.0.0.0
  ports:
    - '6379:6379'
  volumes:
    - 'redis:/data'

4. 检查Redis配置是否被覆盖

进入Web容器执行命令,确认Sidekiq实际生效的Redis配置:

docker-compose exec web rails c
> Sidekiq.configuration.redis

如果返回的地址不是redis://redis:6379/12,排查是否有config/environments/development.rb等其他配置文件覆盖了Sidekiq的Redis配置。

5. 本地手动执行Sidekiq的特殊情况

如果你是在宿主机本地执行bundle exec sidekiq报的错,属于正常现象:宿主机没有redis域名的解析规则,要么将本地hosts文件添加127.0.0.1 redis映射,要么临时修改Redis地址为redis://localhost:6379/12即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:15:02