Celery启动Worker后以代码0退出问题排查求助
Celery Worker启动后无征兆退出(退出码0)排查求助
Celery Worker启动正常,但随后无征兆退出,退出代码为0。以下是相关配置及日志:
Docker Compose中Celery配置
celery: build: context: ./backend dockerfile: ./celeryDockerfile container_name: celery env_file: .env healthcheck: test: celery -b amqp://${RABBITMQ_USER}:${RABBITMQ_PASS}@rabbit status || exit 1 interval: 5s timeout: 10s retries: 3 entrypoint: [ "/app/celery-entrypoint.sh" ] command: celery multi start 2 --logfile=logs/celery.log -l INFO depends_on: backend: condition: service_healthy rabbit: condition: service_healthy
日志输出
celery | celery started celery | celery multi v5.4.0 (opalescent) celery | > Starting nodes... celery | > celery1@3e42fac37fa0: OK celery | > celery2@3e42fac37fa0: OK Gracefully stopping... (press Ctrl+C again to force) Container frontend Stopping Container frontend Stopped Container backend Stopping Container backend Stopped Container gateway Stopping Container gateway Stopped Container dashboard Stopping Container dashboard Stopped Container celery Stopping Container celery Stopped Container rabbit Stopping Container rabbit Stopped Container db Stopping Container db Stopped Container files Stopping Container files Stopped dependency failed to start: container celery exited (0)
注:entrypoint脚本仅包含echo celery started,可忽略该部分。
问题原因
核心问题出在celery multi start命令上:这个命令是后台启动worker进程,执行完启动操作后就会立即退出,返回码0。而Docker容器的生命周期完全依赖主进程,主进程退出后容器就会直接停止,进而触发整个Compose服务的依赖失败提示。
解决方案
方案1:改用celery worker前台启动(推荐)
直接使用celery worker命令启动,指定并发数即可替代celery multi的多worker启动需求,命令会一直前台运行,保证容器不退出:
celery worker -c 2 --logfile=logs/celery.log -l INFO
修改Docker Compose中的command字段为上述内容即可。
方案2:保留celery multi但强制前台运行
如果一定要使用celery multi,需要添加--attach参数,让主进程保持前台运行,不退出:
celery multi start 2 --logfile=logs/celery.log -l INFO --attach
补充说明
Docker容器要求主进程必须处于前台运行状态,否则容器会认为任务完成而停止。Celery的multi start默认是后台启动,不符合Docker的运行模式,这是导致问题的根本原因。
内容的提问来源于stack exchange,提问作者SomeRandomDude111
相关产品推荐
相关产品推荐

