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 "$@"
相關文章
相關標籤/搜索