laradock开机自启动docker-compose,并定时任务执行artisan queue:work检查

1. 目的

使用laradock作为laravel的开发环境,但不想每次开启虚拟机都要手动启动compose,所以添加了开机自启动。并且需要在 compose启动后,执行一个artisan queue:work命令,做队列监听像客户端推送消息。

2. 指定docker-compose.yml 文件启动compose

命令行输入 docker-compose 查看具体命令参数,-f 能指定具体 yml文件,这样就不用在YML文件同级目录下启动命令了。如:

/usr/local/bin/docker-compose -f /home/qujsh/www/laradock/docker-compose.yml up -d workspace

问题1:laradock的 .env 文件

如果只是这么执行,那么会抛错,如:

WARNING: The PHP_VERSION variable is not set. Defaulting to a blank string.
WARNING: The WORKSPACE_INSTALL_SUBVERSION variable is not set. Defaulting to a blank string.

原因是 compose启动时找不到对应的 环境变量,这是配置在 .env文件中的,由于我们无法读取.env文件中的环境变量,所以查看对应的文档发现 全局环境变量的优先级 > .env文件定义变量的优先级,所以,我将 .env文件中的变量临时定义到 全局环境变量。配置 /etc/init.d/compose 文件内容,如:

#!/bin/sh
#chkconfig: 2345 80 90
#description: docker-compose init start

ENV=/home/qujsh/www/laradock/.env
ENV_TMP=/tmp/.env
PATH_YML=/home/qujsh/www/laradock/docker-compose.yml

for var in `cat $ENV | grep -v ^#`;do
    export $var >> $ENV_TMP
done

source $ENV_TMP && \
/usr/local/bin/docker-compose -f $PATH_YML up -d nginx mysql phpmyadmin redis workspace laravel-echo-server

先将 export key=value 内容定义到 /tmp/.env 文件内,然后source .env文件使临时环境变量有效,再执行docker-compose命令。原因时 export是基于bash解析器临时有效的,bash结束它就无效了。
再添加 compose文件为可执行,并开机自启动;

chmod u+x compose
chkconfig compose on

3. 定时任务执行 php artisan queue:work 内容

功能中有个需要监听队列的功能,原打算是启动时执行一次就好了,但看了laradock文档,查看了执行后的workspace内容,觉得还是不要改dockerfile了,大佬的东西是我随便翻翻就能改的吗,还是在规则内处理好了。
workspace是有留下对应的定时任务功能的,可以配合 laravel的 任务调度一起使用。

workspace定时任务处理

查看/home/qujsh/www/laradock/workspace/crontab/root 文件内容,并做调整:

* * * * * root /usr/bin/php /var/www/giantechMp/artisan schedule:run >> /dev/null 2>&1

主要是调整 artisan 文件路径,不用调整就不用重新build了;如果调整了,那你需要执行 docker-compose build workspace,因为定时任务文件拷贝它不是volumes,而是在 执行dockerfile的时候,拷贝到workspace容器中的/etc/cron.d。

laravel定时任务处理

调整 项目名/app/Console/Kernel.php 的schedule() 方法内容,

$schedule->exec('/bin/bash /var/www/laradock/queue.sh')->everyMinute();

表示每分钟执行一次,具体调整查看 laravel文档

queue.sh内容

#!/bin/sh
#this is artisan queue cron.sh
ps -ef|grep queue:work|grep -v grep
if [ $? -ne 0 ] ; then
echo "start process ... "
/usr/bin/php /var/www/giantechMp/artisan queue:work --tries=2 & >> /dev/null 2>&1
fi

意思为 检查 queue:work 队列是否开启,如果没有开启 就执行队列开启任务,一分钟执行一次检查

问题2:定时任务没有执行

  1. 定时任务log文件是 /var/log/cron.log,定时任务是否执行成功可以进行查看
  2. dos2unix 使用yum安装,使用sh -x queue.sh 做语法检查,windows文件在linux下执行的问题

你可能感兴趣的:(laradock开机自启动docker-compose,并定时任务执行artisan queue:work检查)