Docker 使用 supervisord 管理 lumen队列与crontab

以前在docker内使用lumen的队列服务作了一个异步,处理一些内容审核的相关操做。可是每次重启容器以后都须要进入docker内部启动lumen的队列进程(虽然文档内有写使用supervisord管理进程,可是并无那么作。。),最近需求上须要使用crontab,因此决定使用supervisord来管理这些进程。php

supervisord

dockerfile文件

#安装
RUN apt-get update && apt-get install -y \
        supervisor\
        cron \
    
#supervisord  
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/supervisord.conf

#crontab
#将root文件添加到 /var/spool/cron/crontabs/ 下
ADD cron/root /var/spool/cron/crontabs/root

#修改root文件的所属组与权限
RUN chown -R root:crontab /var/spool/cron/crontabs/root \
 && chmod 600 /var/spool/cron/crontabs/root

#建立log文件
RUN touch /var/log/cron.log

EXPOSE 80

ENTRYPOINT ["/usr/bin/supervisord","-c", "/etc/supervisor/supervisord.conf"]
ENTRYPOINT 指令须要加 -c 的参数,否则会有一个 WARNING

supervisord.conf文件

[supervisord]
nodaemon=true
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
autostart=true
autorestart=true
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --daemon --quiet  --delay=3 --sleep=3 --tries=3
autostart=true
autorestart=true
numprocs=3
redirect_stderr=true
[program:entrypoint]
command=/var/www/html/entrypoint.sh
[program:cron]
command=/etc/init.d/cron start
autostart=true
autorestart=true
redirect_stderr=true

这里有几个须要注意的点:html

nodaemon=true supervisord进程将在前台运行
这里须要为true,否则在启动 docker的时候会出现 Exited (0), docker退出的状况。由于镜像的前台必须有东西在跑。
process_name=%(program_name)s_%(process_num)02d 进程name
numprocs=3 指让supervisor运行3进程
numprocs为多个的时候 process_name为必须值,否则name会冲突报错

这篇文章有关于supervisor配置详解laravel

lumen队列

文档说的很详细,这里再也不累赘docker

这篇文章讲的也很详细shell

crontab

在上边的dockerfile 文件中已经写了具体安装与配置。apache

文档里有关于laravel定时任务的具体使用方法segmentfault

须要注意的是cron安装以后须要supervisord启动,而后须要将定时任务条目写在一个root文件内,在dockerfileadd到镜像/var/spool/cron/crontabs/root目录bash

* * * * * /usr/local/bin/php /path-to-your-project/artisan schedule:run >> /dev/null 2>&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 start,再次查看cron.log就能够看到相关日志。post

注意: crontab 使用环境变量的问题

因为crontab的执行机制,因此没法直接使用配置的环境变量,可是咱们应用的配置都是经过环境变量来配置的,因此须要经过 env 命令将这些环境变量保存到 /etc/default/locale 里,crontab 在启动时会加载这个文件里的环境变量,不然在执行命令的时候会没法获取相关的应用配置,致使执行错误。因此使用了一个shell脚本,在supervisord执行它。

entrypoint.sh文件

#!/bin/bash

set -x

rm -rf /etc/default/locale
env >> /etc/default/locale

exec "$@"
相关文章
相关标签/搜索