Docker-与redis、sidekiq、rails SocketError 组合
Docker-compose with redis, sidekiq, rails SocketError
我对 docker-compose 配置中的错误感到困惑。我正在将 redis 与 sidekiq 添加到现有的 rails 应用程序中,该应用程序使用 docker-compose 但我在尝试使容器相互通信时失败了。我尝试了几种不同的选择,并查看了几乎所有涉及该主题的合理主题,但我在基本相同的事情上一直失败。这是我当前的配置(或至少它的相关部分)和错误:
docker-compose.yml
services:
web:
<<: *common-settings
build:
context: .
dockerfile: docker/development/Dockerfile
target: web
command: dumb-init bash -c "(bundle check || bundle install) && rails s -b 0.0.0.0 -p 3000"
depends_on:
- db
- redis
- elasticsearch
ports:
- '3000:3000'
expose:
- 3000
redis:
image: 'redis:5-alpine'
ports:
- '6379:6379'
volumes:
- 'redis:/data'
sidekiq:
depends_on:
- db
- redis
- web
build: .
command: bundle exec sidekiq
volumes:
- .:/app:cached
- bundle:/bundle
env_file:
- ./.env
config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://redis:6379/12' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://redis:6379/12' }
end
是的,这是目前公开的硬编码,但我已经尝试过仅使用 ENV 变量的配置,结果完全相同,无论我从哪里获得结果的值都是相同的。现在尝试这样的东西,因为它没有任何区别。
这是我尝试访问 localhost:3000/sidekiq
时的错误
Error connecting to Redis on redis:6379 (SocketError)
Application Trace | Framework Trace | Full Trace
redis (4.4.0) lib/redis/client.rb:384:in `rescue in establish_connection'
redis (4.4.0) lib/redis/client.rb:365:in `establish_connection'
redis (4.4.0) lib/redis/client.rb:117:in `block in connect'
redis (4.4.0) lib/redis/client.rb:330:in `with_reconnect'
redis (4.4.0) lib/redis/client.rb:116:in `connect'
redis (4.4.0) lib/redis/client.rb:403:in `ensure_connected'
redis (4.4.0) lib/redis/client.rb:255:in `block in process'
redis (4.4.0) lib/redis/client.rb:342:in `logging'
redis (4.4.0) lib/redis/client.rb:254:in `process'
redis (4.4.0) lib/redis/client.rb:148:in `call'
redis (4.4.0) lib/redis.rb:307:in `block in info'
redis (4.4.0) lib/redis.rb:70:in `block in synchronize'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
redis (4.4.0) lib/redis.rb:70:in `synchronize'
redis (4.4.0) lib/redis.rb:306:in `info'
sidekiq (6.2.2) lib/sidekiq.rb:120:in `block in redis_info'
sidekiq (6.2.2) lib/sidekiq.rb:98:in `block in redis'
connection_pool (2.2.5) lib/connection_pool.rb:63:in `block (2 levels) in with'
connection_pool (2.2.5) lib/connection_pool.rb:62:in `handle_interrupt'
connection_pool (2.2.5) lib/connection_pool.rb:62:in `block in with'
connection_pool (2.2.5) lib/connection_pool.rb:59:in `handle_interrupt'
connection_pool (2.2.5) lib/connection_pool.rb:59:in `with'
sidekiq (6.2.2) lib/sidekiq.rb:95:in `redis'
sidekiq (6.2.2) lib/sidekiq.rb:114:in `redis_info'
sidekiq (6.2.2) lib/sidekiq/web/helpers.rb:177:in `redis_info'
.
.
.
当我尝试从 Web 应用程序 运行 一个工作人员,或者去那里使用 bundle exec sidekiq
时发生同样的错误
这是我 运行 docker-compose up
时注销的内容
redis_1 | 1:C 12 Oct 2021 11:44:19.103 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 12 Oct 2021 11:44:19.103 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 12 Oct 2021 11:44:19.103 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 12 Oct 2021 11:44:19.105 * Running mode=standalone, port=6379.
redis_1 | 1:M 12 Oct 2021 11:44:19.105 # Server initialized
redis_1 | 1:M 12 Oct 2021 11:44:19.105 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 12 Oct 2021 11:44:19.105 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain
the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 12 Oct 2021 11:44:19.105 * DB loaded from disk: 0.000 seconds
redis_1 | 1:M 12 Oct 2021 11:44:19.106 * Ready to accept connections
sidekiq_1 | 2021-10-12T11:44:26.712Z pid=1 tid=ouccdy1p5 INFO: Booting Sidekiq 6.2.2 with redis options {:url=>"redis://redis:6379/12"}
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: Booted Rails 5.2.6 application in development environment
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: Running in ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux-musl]
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: See LICENSE and the LGPL-3.0 for licensing details.
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: Upgrade to Sidekiq Pro for more features and support: https://sidekiq.org
至于使用 ENV 变量,我通常尝试在 .env
文件中设置这样的值
REDIS_URL=redis://redis:6379/12
当我检查 docker ps 时,redis 容器正常。
如果我理解正确,URL redis://redis:6379/12
使用 redis
作为主机名称,对应于我在 docker-[=47 中指定的服务名称=] 并且应该允许容器相互通信。这个文件最初有更多的服务,例如 elasticsearch,它们工作得很好。
我已经尝试了很多不同的设置ps,但我觉得我正在用头撞倒。我错过了什么?
您可能没有将 redis 端口暴露给 sidekiq 服务,请尝试在 docker compose 中暴露它。这可能会奏效。
原来我错过了一个关于配置的重要细节
networks:
app:
添加后
networks:
- app
对于redis和sidekiq,一切都能够很好地相互交谈。
我对 docker-compose 配置中的错误感到困惑。我正在将 redis 与 sidekiq 添加到现有的 rails 应用程序中,该应用程序使用 docker-compose 但我在尝试使容器相互通信时失败了。我尝试了几种不同的选择,并查看了几乎所有涉及该主题的合理主题,但我在基本相同的事情上一直失败。这是我当前的配置(或至少它的相关部分)和错误:
docker-compose.yml
services:
web:
<<: *common-settings
build:
context: .
dockerfile: docker/development/Dockerfile
target: web
command: dumb-init bash -c "(bundle check || bundle install) && rails s -b 0.0.0.0 -p 3000"
depends_on:
- db
- redis
- elasticsearch
ports:
- '3000:3000'
expose:
- 3000
redis:
image: 'redis:5-alpine'
ports:
- '6379:6379'
volumes:
- 'redis:/data'
sidekiq:
depends_on:
- db
- redis
- web
build: .
command: bundle exec sidekiq
volumes:
- .:/app:cached
- bundle:/bundle
env_file:
- ./.env
config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://redis:6379/12' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://redis:6379/12' }
end
是的,这是目前公开的硬编码,但我已经尝试过仅使用 ENV 变量的配置,结果完全相同,无论我从哪里获得结果的值都是相同的。现在尝试这样的东西,因为它没有任何区别。
这是我尝试访问 localhost:3000/sidekiq
时的错误Error connecting to Redis on redis:6379 (SocketError)
Application Trace | Framework Trace | Full Trace
redis (4.4.0) lib/redis/client.rb:384:in `rescue in establish_connection'
redis (4.4.0) lib/redis/client.rb:365:in `establish_connection'
redis (4.4.0) lib/redis/client.rb:117:in `block in connect'
redis (4.4.0) lib/redis/client.rb:330:in `with_reconnect'
redis (4.4.0) lib/redis/client.rb:116:in `connect'
redis (4.4.0) lib/redis/client.rb:403:in `ensure_connected'
redis (4.4.0) lib/redis/client.rb:255:in `block in process'
redis (4.4.0) lib/redis/client.rb:342:in `logging'
redis (4.4.0) lib/redis/client.rb:254:in `process'
redis (4.4.0) lib/redis/client.rb:148:in `call'
redis (4.4.0) lib/redis.rb:307:in `block in info'
redis (4.4.0) lib/redis.rb:70:in `block in synchronize'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
redis (4.4.0) lib/redis.rb:70:in `synchronize'
redis (4.4.0) lib/redis.rb:306:in `info'
sidekiq (6.2.2) lib/sidekiq.rb:120:in `block in redis_info'
sidekiq (6.2.2) lib/sidekiq.rb:98:in `block in redis'
connection_pool (2.2.5) lib/connection_pool.rb:63:in `block (2 levels) in with'
connection_pool (2.2.5) lib/connection_pool.rb:62:in `handle_interrupt'
connection_pool (2.2.5) lib/connection_pool.rb:62:in `block in with'
connection_pool (2.2.5) lib/connection_pool.rb:59:in `handle_interrupt'
connection_pool (2.2.5) lib/connection_pool.rb:59:in `with'
sidekiq (6.2.2) lib/sidekiq.rb:95:in `redis'
sidekiq (6.2.2) lib/sidekiq.rb:114:in `redis_info'
sidekiq (6.2.2) lib/sidekiq/web/helpers.rb:177:in `redis_info'
.
.
.
当我尝试从 Web 应用程序 运行 一个工作人员,或者去那里使用 bundle exec sidekiq
这是我 运行 docker-compose up
redis_1 | 1:C 12 Oct 2021 11:44:19.103 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 12 Oct 2021 11:44:19.103 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 12 Oct 2021 11:44:19.103 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 12 Oct 2021 11:44:19.105 * Running mode=standalone, port=6379.
redis_1 | 1:M 12 Oct 2021 11:44:19.105 # Server initialized
redis_1 | 1:M 12 Oct 2021 11:44:19.105 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 12 Oct 2021 11:44:19.105 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain
the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 12 Oct 2021 11:44:19.105 * DB loaded from disk: 0.000 seconds
redis_1 | 1:M 12 Oct 2021 11:44:19.106 * Ready to accept connections
sidekiq_1 | 2021-10-12T11:44:26.712Z pid=1 tid=ouccdy1p5 INFO: Booting Sidekiq 6.2.2 with redis options {:url=>"redis://redis:6379/12"}
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: Booted Rails 5.2.6 application in development environment
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: Running in ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux-musl]
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: See LICENSE and the LGPL-3.0 for licensing details.
sidekiq_1 | 2021-10-12T11:44:27.174Z pid=1 tid=ouccdy1p5 INFO: Upgrade to Sidekiq Pro for more features and support: https://sidekiq.org
至于使用 ENV 变量,我通常尝试在 .env
文件中设置这样的值
REDIS_URL=redis://redis:6379/12
当我检查 docker ps 时,redis 容器正常。
如果我理解正确,URL redis://redis:6379/12
使用 redis
作为主机名称,对应于我在 docker-[=47 中指定的服务名称=] 并且应该允许容器相互通信。这个文件最初有更多的服务,例如 elasticsearch,它们工作得很好。
我已经尝试了很多不同的设置ps,但我觉得我正在用头撞倒。我错过了什么?
您可能没有将 redis 端口暴露给 sidekiq 服务,请尝试在 docker compose 中暴露它。这可能会奏效。
原来我错过了一个关于配置的重要细节
networks:
app:
添加后
networks:
- app
对于redis和sidekiq,一切都能够很好地相互交谈。