You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Rails7+Redis+Sidekiq入队任务无法执行问题

解决Docker中Sidekiq自动运行的配置方案

要让Sidekiq在Docker环境中自动启动并处理任务,你需要在docker-compose.yml中新增一个专门的Sidekiq服务——因为你的Rails容器只负责运行Web服务器,Sidekiq需要独立进程来监听Redis队列。

修改docker-compose.yml配置

在原配置的services节点下添加sidekiq服务,完整配置如下:

version: '3.0'

services:
  web:
    build: .
    entrypoint: >
      bash -c "
      rm -f tmp/pids/server.pid
      && bundle exec rails s -b 0.0.0.0 -p 3000"
    ports:
      - 3000:3000
    volumes:
      - .:/src/myapp
    depends_on:
      - db
      - redis
    links:
      - "db:db"
    environment:
      REDIS_URL: 'redis://redis:6379'
  db:
    image: postgres:11
    environment:
      POSTGRES_PASSWORD: 'postgres'
    volumes:
      - db_data:/var/lib/postgresql/data
    ports:
      - 5432:5432
  redis:
    image: "redis"
  # 新增Sidekiq服务
  sidekiq:
    build: .
    entrypoint: >
      bash -c "
      rm -f tmp/pids/sidekiq.pid
      && bundle exec sidekiq -q default"
    volumes:
      - .:/src/myapp
    depends_on:
      - db
      - redis
    environment:
      REDIS_URL: 'redis://redis:6379'
    links:
      - "db:db"
volumes:
  db_data:
  redis:
    driver: local

关键配置说明

  • 镜像共享:Sidekiq服务和Web服务使用同一个构建上下文(build: .),确保共享Rails环境与依赖包。
  • 启动逻辑:先清理可能残留的Sidekiq pid文件,再执行bundle exec sidekiq -q default启动进程,和你手动执行的命令完全一致。
  • 依赖与环境:通过depends_on确保Redis、PostgreSQL先启动,同时设置和Web服务一致的REDIS_URL,保证Sidekiq能正确连接Redis队列。
  • 代码同步:挂载和Web服务相同的目录卷,确保代码更新时Sidekiq能同步加载最新任务代码。

重启服务生效

修改完成后,执行以下命令重启Docker服务:

docker-compose down && docker-compose up -d --build

之后每次启动Docker时,Sidekiq会自动启动并监听Redis队列,你提交的HardJob任务会被自动执行。如果需要监听多个队列,只需修改Sidekiq启动命令,比如:bundle exec sidekiq -q default -q mailers。

内容的提问来源于stack exchange,提问作者Maxi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:05:30