如何在 Rails 应用程序中将 sidekiq 放入 Docker 中?

2024-01-06

我正在使用 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 放入 Rails 应用程序中的 Docker 中的更多详细信息。供您参考,所有代码都可以在GitHub 存储库 https://github.com/yucigou/dockerize_rails_sidekiq.

配置 Redis 容器

Sidekiq 依赖于Redis https://github.com/mperham/sidekiq。因此,首先,您需要一个 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

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

Test

现在打开以下 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 对 Rails 应用程序进行 dockerize,请参阅docker 撰写文档 https://docs.docker.com/compose/rails/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Rails 应用程序中将 sidekiq 放入 Docker 中? 的相关文章

  • 如何在 ec2 上使用 docker 运行 2 个 WordPress 博客

    我刚刚开始玩 Docker io 这无疑是一个很棒的平台 我有一个问题需要帮助 我在 ec2 setup docker 上运行了一个中型实例 现在我想在中等实例之上使用 docker io 运行 2 个彼此独立的 WordPress 博客
  • 在 Firebase 静态托管上托管 Docker 应用程序

    如何将基于 Docker 容器的应用程序托管到 Firebase 静态托管 它甚至可行 允许吗 或者我应该在 Digital Ocean Vultr Linode AWS 等服务上托管基于 Docker 的应用程序 我使用 Firebase
  • 使用 gem 添加辅助方法

    我找到了很多有关添加表单辅助方法的信息 请参阅我的其他问题之一 但我找不到有关添加辅助方法的任何信息 就好像它们是在application helper rb 我尝试过复制application helper rb从 Rails 应用程序到
  • 配置 session_store.rb 来处理登台和生产?

    我的 Rails 3 1rc6 应用程序上有一个使用子域的暂存和生产环境 我为这些环境购买并配置了不同的域名 因为默认的 some something herokuapp com 不能很好地与子域配合 当我将 session store r
  • 如何在Rails中显示URL指向的图像

    我这里有一张图片http power itp ac cn jmyang funny fun4 jpg http power itp ac cn jmyang funny fun4 jpg我想在我的 Rails 站点中显示它 我该怎么做 您还
  • heroku 上的 Sidekiq - 错误 R14(超出内存配额)

    我有一个在 heroku 上运行的 sidekiq 进程 在运行一段时间后崩溃并显示以下错误消息 错误 R14 超出内存配额 谁能给我任何关于如何开始诊断正在发生的事情的指示 没有任何明显的原因可能导致这种情况 尝试降低并发数 Sideki
  • 构建 Flask docker 镜像时分配端口

    我最近使用 Flask 创建了一个应用程序 并将 py 文件放入 docker 容器中 然而 我对人们分配端口的在线案例感到困惑 首先在我写的 py 文件的底部 if name main app run host 0 0 0 0 port
  • 将对象数组转换为 ActiveRecord::Relation

    我有一个对象数组 我们称其为Indicator 我想运行 Indicator 类方法 def self subjects该数组上的种类 范围等 我知道在一组对象上运行类方法的唯一方法是让它们成为 ActiveRecord Relation
  • jruby-openssl 中已初始化常量

    当在 Torquebox 上运行我的 Rails 应用程序时 我得到了很多 already initialized constant 警告源自gems jruby openssl 0 8 2 lib shared jruby openssl
  • docker dynamodb -sharedDb 选项

    我正在尝试使用官方在本地主机上启动 dynamodbrepo https hub docker com r amazon dynamodb local 我尝试了以下方法 docker run p 8000 8000 amazon dynam
  • Bundler 找不到 gem“rack”的兼容版本:

    我是 Ruby 新手 但实际上如果我不想安装 Redmine 我就不需要它 我正在按照以下说明进行操作http www redmine org projects redmine wiki HowTo install Redmine on C
  • 无法将环境变量传递给 docker

    我正在尝试使用环境变量运行 docker 映像 但它对我来说不起作用 无论是使用 env list 文件还是通过命令行 docker run p 49160 8080 d appname e FOO foo 来自守护程序的错误响应 OCI
  • 是否仍然可以在 Rails 4 中使用测试单元?

    从 Rails 3 2 升级到 Rails 4 后 我的应用程序可以运行 但我用测试单元编写的测试是一场灾难 据传 Minitest 与测试单元 兼容 然而 如果我尝试使用 现在捆绑的 Minitest 就会发现有很多差异 从断言 语句名称
  • 国家/地区的下拉菜单

    您好 我想为国家和州实现下拉菜单 州下拉列表应根据所选国家 地区更改其值 有没有任何插件或 gem 可以在 Rails 中执行此操作 尝试卡门插件 http autonomousmachine com posts 2009 4 1 carm
  • 我可以使用 ActiveRecord 与 Hstore 中的字段的关系吗?

    我可以使用 hstore 哈希中的字段通过活动记录 own to 将一个模型与另一个模型绑定吗 我将详细说明 我有一个用户模型 它根据权限通过 STI 在其字段之一上子类化为许多不同的其他用户模型 class User lt ActiveR
  • 如何在同一视图中渲染两个分页且可 ajax 的集合?

    在 Rails 3 2 索引视图中 我正在渲染两个部分 并且在部分 Show some fields 分页不起作用 如果我改变will paginate要获取实例变量 分页可以工作 但是集合错误 当调用部分时 如何将
  • 在 Ubuntu 中的 Docker 中运行 GUI 程序

    我曾经使用这样的命令运行程序 docker run ti name wireshark e DISPLAY DISPLAY v tmp X11 unix tmp X11 unix v HOME Xauthority root Xauthor
  • Docker Compose:卷声明为外部,但无法找到

    从 docker compose 运行外部卷示例 ymlv3 docs https docs docker com compose compose file external给我以下错误 ERROR Volume data declared
  • 哈米尔评论结束

    我是哈米尔新手 这让我很困惑 我不喜欢删除可以注释掉的代码 但我不知道如何在 haml 中正确结束注释 这是一个代码片段 field f label member id br f text field member id field f l
  • 如何从我的网站在 Facebook 上发布新闻源

    我有一个网站 允许用户通过 RPX 系统使用 Facebook 登录 ID 登录 当用户在我的网站上发表评论时 我希望它也能自动在他们的 Facebook 墙上发布评论 我如何使用 Rails 来做到这一点 我已经学习 facebooker

随机推荐