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
相关产品推荐
相关产品推荐

