如何在 rails 应用程序中将 sidekiq 放入 Docker?
How to put sidekiq into Docker in a rails application?
我正在使用 rails、sidekiq 和 docker。
我的docker-compose.yml文件
sidekiq:
build: .
command: bundle exec sidekiq -C config/sidekiq.yml
links:
- db
- redis
config/sidekiq.yml 文件
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
- default
我运行docker-compose up
之后sidekiq服务无法正常启动
sidekiq_1 | No such file or directory @ rb_sysopen - /testapp/tmp/pids/sidekiq.pid
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in `initialize'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in `open'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in `write_pid'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:42:in `parse'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/bin/sidekiq:12:in `<top (required)>'
sidekiq_1 | /usr/local/bundle/bin/sidekiq:16:in `load'
sidekiq_1 | /usr/local/bundle/bin/sidekiq:16:in `<main>'
testapp_sidekiq_1 exited with code 1
尝试装载卷。您的 docker-compose
文件应该如下所示(使用 PostgreSQL 作为数据库):
web:
build: .
volumes:
- .:/myapp
links:
- db
- redis
ports:
- "3000:3000"
command: bundle exec rails server -b 0.0.0.0
sidekiq:
build: .
volumes:
- .:/myapp
links:
- db
- redis
command: bundle exec sidekiq
db:
image: postgres
redis:
image: redis
关于如何在 Rails 应用程序中将 Sidekiq 放入 Docker 的更多详细信息。为了您的参考,所有代码都可以在 a GitHub repository.
上找到
配置 Redis 容器
Sidekiq depends on Redis。所以首先,你需要一个 Redis 容器来 运行 旁边。
在您的 docker-compose.yml 中,添加(作为示例):
redis:
image: redis:4.0-alpine
Docker使用 Sidekiq
与您的 Rails 应用共享同一个 Docker 文件:
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
更新您的 docker-compose.yml
sidekiq:
build: .
command: bundle exec sidekiq
depends_on:
- redis
volumes:
- .:/myapp
env_file:
- .env
环境文件 .env 如下所示:
JOB_WORKER_URL=redis://redis:6379/0
同样在您的 docker-compose.yml 中,将 sidekiq 添加到您的 Rails 应用程序的依赖列表中:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
- sidekiq
env_file:
- .env
添加到您的 Gemfile
gem 'sidekiq'
gem 'sidekiq-scheduler'
gem 'sidekiq-unique-jobs'
gem 'sinatra', require: nil
Sidekiq 网络需要 sinatra gem UI(如下所示的仪表板)
配置 Sidekiq
添加文件config/initializers/sidekiq.rb:
sidekiq_config = { url: ENV['JOB_WORKER_URL'] }
Sidekiq.configure_server do |config|
config.redis = sidekiq_config
end
Sidekiq.configure_client do |config|
config.redis = sidekiq_config
end
添加一个 Sidekiq worker
目录app/workers/下,添加文件my_worker.rb:
class MyWorker
include Sidekiq::Worker
def perform(who, message)
logger.info "Message from #{who} is #{message}"
end
end
就是这样。现在您可以在 Rails 中提交作业,例如在控制器中。
MyWorker.perform_async(who, message)
然后工人将接手工作,并在日志文件中输出一条消息。
构建并 运行 使用 docker 编写
一切就绪后,您可以使用 docker 构建 docker 图像和 运行 您的应用:
docker-compose build
docker-compose up
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0515ac60a8b hellosidekiq_web "bundle exec rails..." 23 minutes ago Up 23 minutes 0.0.0.0:3000->3000/tcp hellosidekiq_web_1
080e33963e3a hellosidekiq_sidekiq "bundle exec sidekiq" 23 minutes ago Up 23 minutes hellosidekiq_sidekiq_1
80d1c03f0573 redis:4.0-alpine "docker-entrypoint..." 4 days ago Up 23 minutes 6379/tcp hellosidekiq_redis_1
5915869772e4 postgres "docker-entrypoint..." 4 days ago Up 23 minutes 5432/tcp hellosidekiq_db_1
测试
现在打开以下URL提交工作:
http://localhost:3000/job/submit/John/Prepare%20ye%20the%20way
并且在日志文件中,您会看到类似这样的内容:
sidekiq_1 | 2017-11-13T17:08:45.876Z 1 TID-qw47g MyWorker JID-b7b6d39b0d5193cd01e97cb1 INFO: Message from John is Prepare ye the way
Sidekiq 仪表板
如果您想使用 Sidekiq 仪表板,如下所示
您可以将路线添加到您的 routes.rb
require 'sidekiq/web'
require 'sidekiq-scheduler/web'
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
mount Sidekiq::Web => '/sidekiq'
get 'job/submit/:who/:message', to: 'job#submit'
end
希望对您有所帮助。
顺便说一下,如果您想了解如何使用 docker compose docker 化您的 Rails 应用程序,请参阅 docker compose documentation。
我正在使用 rails、sidekiq 和 docker。
我的docker-compose.yml文件
sidekiq:
build: .
command: bundle exec sidekiq -C config/sidekiq.yml
links:
- db
- redis
config/sidekiq.yml 文件
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
- default
我运行docker-compose up
之后sidekiq服务无法正常启动
sidekiq_1 | No such file or directory @ rb_sysopen - /testapp/tmp/pids/sidekiq.pid
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in `initialize'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in `open'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in `write_pid'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:42:in `parse'
sidekiq_1 | /usr/local/bundle/gems/sidekiq-3.5.3/bin/sidekiq:12:in `<top (required)>'
sidekiq_1 | /usr/local/bundle/bin/sidekiq:16:in `load'
sidekiq_1 | /usr/local/bundle/bin/sidekiq:16:in `<main>'
testapp_sidekiq_1 exited with code 1
尝试装载卷。您的 docker-compose
文件应该如下所示(使用 PostgreSQL 作为数据库):
web:
build: .
volumes:
- .:/myapp
links:
- db
- redis
ports:
- "3000:3000"
command: bundle exec rails server -b 0.0.0.0
sidekiq:
build: .
volumes:
- .:/myapp
links:
- db
- redis
command: bundle exec sidekiq
db:
image: postgres
redis:
image: redis
关于如何在 Rails 应用程序中将 Sidekiq 放入 Docker 的更多详细信息。为了您的参考,所有代码都可以在 a GitHub repository.
上找到配置 Redis 容器
Sidekiq depends on Redis。所以首先,你需要一个 Redis 容器来 运行 旁边。
在您的 docker-compose.yml 中,添加(作为示例):
redis:
image: redis:4.0-alpine
Docker使用 Sidekiq
与您的 Rails 应用共享同一个 Docker 文件:
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
更新您的 docker-compose.yml
sidekiq:
build: .
command: bundle exec sidekiq
depends_on:
- redis
volumes:
- .:/myapp
env_file:
- .env
环境文件 .env 如下所示:
JOB_WORKER_URL=redis://redis:6379/0
同样在您的 docker-compose.yml 中,将 sidekiq 添加到您的 Rails 应用程序的依赖列表中:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
- sidekiq
env_file:
- .env
添加到您的 Gemfile
gem 'sidekiq'
gem 'sidekiq-scheduler'
gem 'sidekiq-unique-jobs'
gem 'sinatra', require: nil
Sidekiq 网络需要 sinatra gem UI(如下所示的仪表板)
配置 Sidekiq
添加文件config/initializers/sidekiq.rb:
sidekiq_config = { url: ENV['JOB_WORKER_URL'] }
Sidekiq.configure_server do |config|
config.redis = sidekiq_config
end
Sidekiq.configure_client do |config|
config.redis = sidekiq_config
end
添加一个 Sidekiq worker
目录app/workers/下,添加文件my_worker.rb:
class MyWorker
include Sidekiq::Worker
def perform(who, message)
logger.info "Message from #{who} is #{message}"
end
end
就是这样。现在您可以在 Rails 中提交作业,例如在控制器中。
MyWorker.perform_async(who, message)
然后工人将接手工作,并在日志文件中输出一条消息。
构建并 运行 使用 docker 编写
一切就绪后,您可以使用 docker 构建 docker 图像和 运行 您的应用:
docker-compose build
docker-compose up
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0515ac60a8b hellosidekiq_web "bundle exec rails..." 23 minutes ago Up 23 minutes 0.0.0.0:3000->3000/tcp hellosidekiq_web_1
080e33963e3a hellosidekiq_sidekiq "bundle exec sidekiq" 23 minutes ago Up 23 minutes hellosidekiq_sidekiq_1
80d1c03f0573 redis:4.0-alpine "docker-entrypoint..." 4 days ago Up 23 minutes 6379/tcp hellosidekiq_redis_1
5915869772e4 postgres "docker-entrypoint..." 4 days ago Up 23 minutes 5432/tcp hellosidekiq_db_1
测试
现在打开以下URL提交工作:
http://localhost:3000/job/submit/John/Prepare%20ye%20the%20way
并且在日志文件中,您会看到类似这样的内容:
sidekiq_1 | 2017-11-13T17:08:45.876Z 1 TID-qw47g MyWorker JID-b7b6d39b0d5193cd01e97cb1 INFO: Message from John is Prepare ye the way
Sidekiq 仪表板
如果您想使用 Sidekiq 仪表板,如下所示
您可以将路线添加到您的 routes.rb
require 'sidekiq/web'
require 'sidekiq-scheduler/web'
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
mount Sidekiq::Web => '/sidekiq'
get 'job/submit/:who/:message', to: 'job#submit'
end
希望对您有所帮助。
顺便说一下,如果您想了解如何使用 docker compose docker 化您的 Rails 应用程序,请参阅 docker compose documentation。