我将我的Rails应用程序(本地开发机器)迁移到Docker-Compose。除了Worker Rails实例(批处理)无法连接到Redis之外,一切正常。
Completed 500 Internal Server Error in 40ms (ActiveRecord: 2.3ms)
Redis::CannotConnectError (Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)):
在我的docker-compose.yml
中redis:
image: redis
ports:
- "6379:6379"
batch:
build: .
command: bundle exec rake environment resque:work QUEUE=*
volumes:
- .:/app
links:
- db
- redis
environment:
- REDIS_URL=redis://redis:6379
我认为Redis实例可以通过Docker主机的IP获得。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v1.10.0
通过0.0.0.0访问不起作用
$ curl 0.0.0.0:6379
curl: (7) Failed to connect to 0.0.0.0 port 6379: Connection refused
通过docker-machine IP访问我觉得有效:
$ curl http://192.168.99.100:6379
-ERR wrong number of arguments for 'get' command
-ERR unknown command 'Host:'
修改的
在批处理实例中安装 redis-cli 后,我可以使用'redis'主机名命中redis服务器。我认为问题可能出在Rails配置本身。
答案 0 :(得分:2)
如果你跑
docker-compose run --rm batch env | grep REDIS
您将获得容器所具有的env变量(compose中的链接行将自动生成一些变量)。 然后你需要做的就是找一条_REDIS_1_PORT ......并使用正确的一行。我从未有过以任何其他方式将我的导轨连接到另一个服务的运气。但幸运的是,这些env变量总是在启动时生成,因此即使容器IP在启动之间发生变化,它们也会是最新的。
答案 1 :(得分:2)
您应该使用主机名redis
连接到该服务,但您可能需要等待redis启动。
答案 2 :(得分:2)
捂脸!!!
docker容器正在通信很好,问题是我没有告诉Resque(使用Redis的应用程序)在哪里找到它。感谢“The Real Bill”指出我应该使用docker-cli。
对于使用Docker和Resque的其他人,您需要在 config / initializers / resque.rb 文件中使用此功能:
std::vector