以前在docker
內使用lumen
的隊列服務作了一個異步,處理一些內容審覈的相關操做。可是每次重啓容器以後都須要進入docker
內部啓動lumen
的隊列進程(雖然文檔內有寫使用supervisord
管理進程,可是並無那麼作。。),最近需求上須要使用crontab
,因此決定使用supervisord
來管理這些進程。php
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
文檔說的很詳細,這裏再也不累贅docker
這篇文章講的也很詳細shell
在上邊的dockerfile
文件中已經寫了具體安裝與配置。apache
文檔裏有關於laravel定時任務的具體使用方法segmentfault
須要注意的是cron
安裝以後須要supervisord
啓動,而後須要將定時任務條目寫在一個root
文件內,在dockerfile
中add
到鏡像/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 "$@"