如何把sidekiq放入一个rails应用程序中的Docker?
我正在使用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 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
文件应该看起来像这样(用PosgtreSQL作为数据库):
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的一些细节。 为了供您参考,所有的代码都可以在GitHub仓库上find 。
configurationRedis容器
Sidekiq 取决于Redis 。 所以首先,你需要一个Redis容器来运行。
在您的docker-compose.yml中,添加(作为示例):
redis: image: redis:4.0-alpine
Dockerize Sidekiq
与您的Rails应用程序共享相同的Dockerfile:
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
Sidekiqnetworking用户界面需要Sinatragem(下面显示的仪表板)
configurationSidekiq
添加文件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工作者
在目录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构build和运行
一切就绪之后,您可以构build泊坞窗图像,并使用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
testing
现在打开下面的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撰写dockerize您的Rails应用程序,请参阅docker 撰写文档 。