web-dev-qa-db-ja.com

Railsアプリケーションでsidekiqを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-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
9
scho

ボリュームをマウントしてみてください。 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
19
Renaud Kern

SidekiqをRailsアプリケーションでDockerに配置する方法について、一般的にもう少し詳しく説明します。参考までに、すべてのコードは GitHubリポジトリ で入手できます。

Redisコンテナを設定する

Sidekiq Redisによって異なります 。そのため、まず、Redisコンテナを一緒に実行する必要があります。

Docker-compose.ymlに、(例として)次を追加します。

redis:
  image: redis:4.0-Alpine

Dockerize Sidekiq

同じDockerfileをRailsアプリ:

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

Sinatra gemは、Sidekiq Web 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ワーカーを追加する

ディレクトリ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)

そして、ワーカーはジョブを取得し、ログファイルにメッセージを出力します。

Dockercomposeでビルドして実行する

すべてが整ったら、dockerイメージを作成し、dockercomposeを使用してアプリを実行できます。

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ダッシュボードを使用する場合は、以下のようになります

enter image description here

ルートを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

それが役に立てば幸い。

ちなみに、dockercomposeを使用してRailsアプリケーションをドッキングする方法を知りたい場合は、 dockercomposeドキュメント を参照してください。

21
Yuci