Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)
最近项目涉及到一个定时任务的功能,所以去这几天研究了一下 crontab 的使用方法,按照网上的相关教程顺利在自己的电脑上成功开启了这个功能
Laravel + crontab
添加 crontab 配置
1、执行命令
$ crontab -e
2、添加以下内容( path/to为应用路径 ),即每分钟去执行一次以下的命令
* * * * * php /path/to/artisan schedule:run >> /dev/null >&
3、启动(以下命令为Ubuntu下的启动命令,其他系统可能不一样)
$ /etc/init.d/cron start
完成以上三步即可以成功开启 Laravel 的任务调度功能了,下面验证一下
验证任务调度是否正常执行
./App\Console\Kernel
过几分钟后就可以去查看一下数据库有没有成功插入数据~
DaoCloud + Docker + Laravel + crontab
上面的尝试成功后就是将这些配置到 Dockerfile 里,让容器在启动的时间自动开启 crontab 任务调度,让这一切都自动去完成~
具体步骤
1、在项目创建以下 crontab 配置文件 ./_linux/var/spool/cron/crontabs/root
* * * * * /usr/local/bin/php /app/artisan schedule:run >> /dev/null >&
2、在 Dockerfile 里将配置文件复制到 crontab 指定的配置所在目录
FROM php:7.0.-apacheMAINTAINER JianyingLi # 安装 cron 命令... RUN apt-get update && apt-get install -y cron vim...# 配置 crontab# 复制配置文件 /var/spool/cron/crontabs/ADD _linux/var/spool/cron/crontabs/root /var/spool/cron/crontabs/root# 设置文件所有者和文件关联组为 root:crontab ,关联组必须为 crontabRUN chown -R root:crontab /var/spool/cron/crontabs/root \# 修改文件的权限,必须为 ,否则不认 && chmod /var/spool/cron/crontabs/root# 创建 log 文件RUN touch /var/log/cron.log...# 在 entrypoint.sh 脚本里加入启动 apache 和 crontab 的相关命令RUN chmod ./entrypoint.shENTRYPOINT ["./entrypoint.sh"]
3、添加 ./entrypoint.sh 脚本,并在里面启动 apache 和 crontab
php:7.0.7-apache这个基础镜像已经包含了一个 CMD ['apache2-foreground']指令用于启动 apache 服务,但是我们需要同时启动apache 和 crontab ,所以增加了这个脚本文件并在里面加入了相关的命令。
#!/bin/bashset -x# 将环境变量保存至 /etc/default/localerm -rf /etc/default/localeenv >> /etc/default/locale# 启动 crontab/etc/init.d/cron start# 启动 apacheapache2-foregroundexec "$@"
由于crontab的执行机制,所以无法直接使用通过DaoCloud后台配置的环境变量,但是我们应用的配置都是通过环境变量来配置的,所以需要通过 env 命令将这些环境变量保存到 /etc/default/locale里,crontab 在启动时会加载这个文件里的环境变量,否则在执行 php artisan schedule:run命令会无法获取相关的应用配置,导致无法执照我们预想的去运行(例如始终无法插入新数据到数据库)
完整相关文件
以下是三个主要是配置文件,我是用来构建运行 Laravel5 应用的,应该可以满足大部分的需求。
.├── _linux│ └── var│ └── spool│ └── cron│ └── crontabs│ └── root├── Dockerfile└── entrypoint.sh
./Dockerfile FROM php:7.0.-apacheMAINTAINER JianyingLi RUN apt-get update \ && apt-get install -y \ libmcrypt-dev \ libz-dev \ git \ cron \ vim \ && docker-php-ext-install \ mcrypt \ mbstring \ pdo_mysql \ zip \ && apt-get clean \ && apt-get autoclean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composerADD _linux/var/spool/cron/crontabs/root /var/spool/cron/crontabs/rootRUN chown -R root:crontab /var/spool/cron/crontabs/root \ && chmod 600 /var/spool/cron/crontabs/rootRUN touch /var/log/cron.logRUN a2enmod rewriteWORKDIR /appCOPY ./composer.json /app/COPY ./composer.lock /app/RUN composer install --no-autoloader --no-scriptsCOPY . /appRUN rm -fr /var/www/html \ && ln -s /app/public /var/www/htmlRUN chown -R www-data:www-data /app \ && chmod -R 0777 /app/storage \ && composer installRUN chmod 777 ./entrypoint.shENTRYPOINT ["./entrypoint.sh"]
./_linux/var/spool/cron/crontabs/root * * * * * /usr/local/bin/php /app/artisan schedule:run >> /dev/null 2>&1
./entrypoint.sh #!/bin/bashset -xrm -rf /etc/default/localeenv >> /etc/default/locale/etc/init.d/cron startapache2-foregroundexec "$@"
以上内容希望帮助到大家
更多PHP相关知识请关注我的专栏PHPzhuanlan.zhihu.com
Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)的更多相关文章
- 从零开始通过idea插件将一个spring boot项目部署到docker容器里运行
实操:将一个spring boot项目部署到docker容器里运行 实验需要的环境: 腾讯云+Ubuntu 16.04 x64+idea+插件docker integration+daocloud 第 ...
- docker容器里设置中文时区
本文讨论docker容器里中文时区的问题,总所周知docker hub上的镜像默认都是英文时区的,在国人使用过程当中需要将时区设置成中文,我原来光配置/etc/localtime了date显示的时间也 ...
- 把Gitlab迁移到Docker容器里
把Gitlab迁移到Docker容器里 Apr 9, 2015. | By: 任怀林 公司的gitlab一直是运行在ovm的虚拟机里的,版本还是6.7.5.版本有点老了,最近在研究docker,于是想 ...
- Docker容器里时间与宿主机不同步
docker容器里时间设置: 第一种: Dockerfile文件中添加一行:RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime或者 第二种: ...
- python服务不能在docker容器里运行的问题
在开发过程中,我们将mysql.redis.celery等服务在docker容器里跑,项目在本地运行,便于debug调试 docker-compose -f docker-compose-dev.ym ...
- Docker容器安装配置SQLServer服务(Linux)
一:前言 随着不断的对Docker容器的实践和学习,越来越觉得容器的强大,把 SQL Server 数据库服务放在docker容器中,比你自己在宿主服务器上面安装配置一个SQL Server服务器是要 ...
- Docker容器网络配置
Docker容器网络配置 1.Linux内核实现名称空间的创建 1.1 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令 ...
- docker - 容器里安装ssh
docker安装ssh 通过命令行安装 pull ubuntu镜像 docker pull ubuntu:latest 启动并进入bash docker run -it -d ubuntu:laste ...
- 怎么修改无法启动的docker容器的配置?
原因: 由于错误的配置导致原来可以启动的docker容器不能启动了.相信很多人的做法是删除容器重建一个,这样也是可以的,但是你的配置和插件就得重新安装,非常麻烦.最小的代价当然是修改原来的配置让他能启 ...
随机推荐
- JDBC——DriverManager驱动管理对象
功能 1.注册驱动 注册驱动:告诉程序使用哪个驱动jar包 写代码使用:Class.forName("com.mysql.jdbc.Driver"); 查看源码 mysql-con ...
- Python入门8 —— 逻辑运算符补充
一:优先级:not > and > or 1.not与紧跟其后的那个条件是不可分割的 2.如果条件语句全部由纯and.或纯or链接,按照从左到右的顺序依次计算即可 print(True a ...
- 3_time
3. Time and order What is order and why is it important? What do you mean "what is order"? ...
- Book: The TimeViz Browser
website; A visual survey of visualization techniques for time-oriented data. 1. Left pannel ----- fi ...
- Educational Codeforces Round 80 A-E简要题解
contest链接:https://codeforces.com/contest/1288 A. Deadline 题意:略 思路:根据题意 x + [d/(x+1)] 需要找到一个x使得上式小于等于 ...
- 剑指offer(leetcode 10.) 正则表达式匹配
这题一年前就做过,当时刚开始刷leetcode,提交了几十次过不去,就放那没管了.今天剑指offer又遇到这题,终于做出来了,用的dp. class Solution { public: bool i ...
- 极客工具,PDF合并工具
前言 这两天一番花两天的时间,重新用python和python图形化开发工具tkinter,完善了下PDF合并小工具,终于可以发布了. 工具目前基本功能已经完善,后期如果有反馈可以修复部分bug或完善 ...
- 使用VSCode的Remote-SSH连接Linux进行远程开发
安装Remote-SSH并配置 首先打开你的VSCode,找到Extensions,搜索Remote,下载Remote-Developoment插件,会自动安装其他的Remote插件,其中会包含Rem ...
- 在虚拟机中使用Git
自己如何从安装虚拟机到使用git进行项目代码版本管理的部分教程因为是自学所以没有好的教程只能自己进行百度,网上的教程太多了但都是只是一个模块没有从头到尾详细的教程,我们如果有个详细的教程本来只需花很少 ...
- C++-POJ1067-取石子游戏
//(ak,bk)=([k*(1+sqrt(5))/2],[k*(1+sqrt(5))/2]+k)=(ak,ak+k) #include <cstdio> double sqrt5=2.2 ...