如何把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 撰写文档 。