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
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:定时任务没有执行
- 定时任务log文件是 /var/log/cron.log,定时任务是否执行成功可以进行查看
- dos2unix 使用yum安装,使用sh -x queue.sh 做语法检查,windows文件在linux下执行的问题