当前位置: 首页 > 后端技术 > PHP

Docker使用supervisord来管理lumen队列和crontab

时间:2023-03-29 16:10:21 PHP

,然后使用docker中的lumen队列服务做一个异步过程来处理一些内容审计相关的操作。但是每次重启容器,都需要进入docker启动lumenqueue进程(虽然文档里写了用supervisord来管理进程,但是你并没有那么做。。。)。最近需要用到crontab,所以决定用supervisord来管理这些进程。supervisorddockerfile#InstallRUNapt-getupdate&&apt-getinstall-y\supervisor\cron\#supervisordRUNmkdir-p/var/log/supervisorCOPYsupervisord.conf/etc/supervisor/supervisord.conf#crontab#根文件加入/var/spool/cron/crontabs/下ADDcron/root/var/spool/cron/crontabs/root#修改根文件的组和权限RUNchown-Rroot:crontab/var/spool/cron/crontabs/root\&&chmod600/var/spool/cron/crontabs/root#创建日志文件RUNtouch/var/log/cron.logEXPOSE80ENTRYPOINT["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]注意:ENTRYPOINT命令需要加上-c参数,否则supervisord.conf文件会有WARNING[supervisord]nodaemon=true[program:apache2]command=/bin/bash-c"source/etc/apache2/envvars&&exec/usr/sbin/apache2-DFOREGROUND"autostart=trueautorestart=true[program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php/var/www/html/artisan队列:work--daemon--quiet--delay=3--sleep=3--tries=3autostart=trueautorestart=truenumprocs=3redirect_stderr=true[program:entrypoint]command=/var/www/html/entrypoint.sh[program:cron]command=/etc/init.d/cronstartautostart=trueautorestart=trueredirect_stderr=true这里有几个要点注意:nodaemon=truesupervisord进程会在前台运行。这里必须是真的。否则启动docker时会出现Exited(0)。docker退出的时候,镜像的前台肯定有东西在运行。process_name=%(program_name)s_%(process_num)02d进程名numprocs=3表示让supervisor运行3个进程。当有多个numproc时,process_name必须是一个值,否则名称会冲突,报错。这篇文章对supervisor配置lumenqueue的文档有详细的解释,讲的很详细,这里不再赘述。这篇文章也很详细。crontab的具体安装和配置在上面的dockerfile中已经写好了。文档中有laravel定时任务的具体使用方法。需要注意的是,安装cron后需要启动supervisord,然后需要将定时任务入口写入一个根文件,添加到dockerfile根目录下的镜像/var/spool/cron/crontabs/中*****/usr/local/bin/php/path-to-your-project/artisanschedule:run>>/dev/null2>&1注意:需要写/usr/local/bin/php否则会有是任务未执行的情况。这个cron将每分钟调用lumen命令调度程序。当执行schedule:run命令时,lumen会评估您的计划任务并运行到期任务。有可能任务没有执行,需要查看/var/log/cron.log日志文件查看具体原因。如果日志文件没有内容,需要安装rsyslog,然后修改/etc/rsyslog.conf文件,去掉cron.*/var/log/cron.log前的注释。然后启动/etc/init.d/rsyslog,再次查看cron.log,查看相关日志。注意:crontab中使用环境变量的问题由于crontab的执行机制,配置的环境变量不能直接使用,但是我们应用的配置是通过环境变量来配置的,所以这些环境变量需要保存到/etc通过env命令在/default/locale中,crontab在启动时会加载该文件中的环境变量,否则在执行命令时将无法获取相关应用配置,导致执行错误。所以使用了一个shell脚本,在supervisord中执行它。entrypoint.sh文件#!/bin/bashset-xrm-rf/etc/default/localeenv>>/etc/default/localeexec"$@"