docker版piwik,如何执行定时任务?
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔在本文中,给大家带来的是,piwik批量任务的docker版本设置过程。为啥docker版本要特别的说明呢?因为docker下面默认没有crontab,就是说,我们想当然的在piwik的docker镜像里面,设置crontab是不可能完成的任务。不用吐槽,docker的镜像里面连vi都没有,所以,根本不必吐槽没有crontab。
解决方案
本篇文章可能正确答案很多,大家根据自己的情况来选择不同的答案。我的宿主机是个mac,所以,对于我来说,标准答案可能是如下这样的。
首先,利用docker的共享目录,先建立好了一个sh文件。内容如下:
/usr/local/bin/php /var/www/html/console core:archive --url=http://localhost:10001/ >> /var/www/html/crontab/piwik-archive.log
上面涉及到的路径信息,都是基于docker的some-piwik这个镜像的。
然后利用宿主机(mac)来执行docker(some-piwik)里面的这个sh脚本。这个过程中,主体身份切换蛮频繁的。大家要仔细想好。
*/1 * * * * /Applications/Docker.app/Contents/Resources/bin/docker exec some-piwik /bin/bash /var/www/html/crontab/crontab.sh >/www/docker/piwik_cron.log 2>&1
上图中,黄色箭头是镜像里面的路径,橙色是镜像外的路径。是不是非常难?我觉得也是。各种命令组合的非常复杂,而且也没有个括号之类的,体现一下优先级别。
到此为止,答案已经揭晓完毕。
基本原理
下面开始,由苏南大叔给大家,详细说明一下。在docker镜像里面shell脚本,也可以写成这样。
cd /var/www/html && php console core:archive --url=http://localhost:10001 >> /var/www/html/contab/docker_cron.log
这里面,就用了一些,简写的相对路径。
而镜像外宿主机上的shell也可以写成这样。
* * * * * docker exec some-piwik sh /var/www/html/crontab/crontab.sh
看起来明朗很多了吧。但是,可能理想和现实就是有差别的。路径简写,就可能带来意料之外的结果了。命令在shell里面可以直接执行。但是放到crontab里面,就不按套路走了。这是个悲伤的故事。调试的方法就是在crontab的后面带上如下类似脚本:
>/yourpath/log.log 2>&1
这样的话,crontab的输出就会输出到这里,然后就可以看到一些错误输出了。这也就是为什么,苏南大叔的最初的脚本里面,docker命令会使用全路径的原因。当然,你还会看到其他的错误输出,所以,这个crontab级别的log输出,还是挺有用的。
至于docker的位置,是用下面的方法找到的。
find / -name docker
好了,原理基本上叙述完毕。
相关截图
剩下的是中间过程的一些其他截图,大家看看吧。
相关链接
相关文章地址如下:
总结
对于其他的情况来说,解决方案应该大同小异。不过,要掌握好crontab的调试方法。才好具体问题具体分析。您说,对吧。关于piwik的更多相关文章,请点击苏南大叔的其他文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。