Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rails应用程序中将sidekiq放入Docker?_Ruby On Rails_Docker_Sidekiq - Fatal编程技术网

Ruby on rails 如何在rails应用程序中将sidekiq放入Docker?

Ruby on rails 如何在rails应用程序中将sidekiq放入Docker?,ruby-on-rails,docker,sidekiq,Ruby On Rails,Docker,Sidekiq,我正在使用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: - de

我正在使用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
sidekiq_1 |没有这样的文件或目录@rb_sysopen-/testapp/tmp/pids/sidekiq.pid
sidekiq|u 1 |/usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in'initialize'
sidekiq|u 1 |/usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:在“开放”中
sidekiq|u 1 |/usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:365:in'write|u pid'
sidekiq|u 1 |/usr/local/bundle/gems/sidekiq-3.5.3/lib/sidekiq/cli.rb:42:in'parse'
sidekiq|u 1 |/usr/local/bundle/gems/sidekiq-3.5.3/bin/sidekiq:12:in`'
sidekiq|u 1 |/usr/local/bundle/bin/sidekiq:16:in'load'
sidekiq|u 1 |/usr/local/bundle/bin/sidekiq:16:in`'
testapp_sidekiq_1已退出,代码为1

尝试装入卷。您的
docker compose
文件应如下所示(以PosgtreSQL作为数据库):


关于如何在Rails应用程序中将Sidekiq放入Docker的更多细节。供您参考,所有代码都可以在上找到

配置Redis容器 西德基。因此,首先,您需要一个Redis容器来并行运行

在docker-compose.yml中,添加(作为示例):

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
sidekiq_1  | 2017-11-13T17:08:45.876Z 1 TID-qw47g MyWorker JID-b7b6d39b0d5193cd01e97cb1 INFO: Message from John is Prepare ye the way
另外,在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
添加到您的文件中 Sidekiq web UI需要sinatra gem(仪表板如下所示)

配置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)
工人将拿起作业,并在日志文件中输出一条消息

使用docker compose构建并运行 一切就绪后,您可以构建docker映像并使用docker compose运行应用程序:

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
在日志文件中,您将看到如下内容:

JOB_WORKER_URL=redis://redis:6379/0
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对Rails应用程序进行docker化,请参阅。

谢谢。此方法能否加载sidekiq配置文件
-C config/sidekiq.yml
?指定REDIS_URL似乎很方便。为什么
sidekiq
和'web'容器都需要映射到相同的外部目录?为什么他们不能在各自的容器中使用/myapp的副本?如果未映射卷,则会出现上述错误。请解决上述问题,并通过向dockerfile添加:
RUN mkdir-p/usr/src/soloid api/tmp/pids
,从容器内部使用副本。与rails不同,Sidekiq不会创建一个
pids
文件夹,并且会混淆。在本例中,Sidekiq和web都创建了2个容器。如何在一个容器中配置两个服务。谢谢你是最棒的,@Yuci!
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