最近项目涉及到一个定时任务的功能,所以去这几天研究了一下 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相关知识请关注我的专栏PHP​zhuanlan.zhihu.com

Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)的更多相关文章

  1. 从零开始通过idea插件将一个spring boot项目部署到docker容器里运行

    实操:将一个spring boot项目部署到docker容器里运行 实验需要的环境: 腾讯云+Ubuntu 16.04 x64+idea+插件docker integration+daocloud 第 ...

  2. docker容器里设置中文时区

    本文讨论docker容器里中文时区的问题,总所周知docker hub上的镜像默认都是英文时区的,在国人使用过程当中需要将时区设置成中文,我原来光配置/etc/localtime了date显示的时间也 ...

  3. 把Gitlab迁移到Docker容器里

    把Gitlab迁移到Docker容器里 Apr 9, 2015. | By: 任怀林 公司的gitlab一直是运行在ovm的虚拟机里的,版本还是6.7.5.版本有点老了,最近在研究docker,于是想 ...

  4. Docker容器里时间与宿主机不同步

    docker容器里时间设置: 第一种: Dockerfile文件中添加一行:RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime或者 第二种: ...

  5. python服务不能在docker容器里运行的问题

    在开发过程中,我们将mysql.redis.celery等服务在docker容器里跑,项目在本地运行,便于debug调试 docker-compose -f docker-compose-dev.ym ...

  6. Docker容器安装配置SQLServer服务(Linux)

    一:前言 随着不断的对Docker容器的实践和学习,越来越觉得容器的强大,把 SQL Server 数据库服务放在docker容器中,比你自己在宿主服务器上面安装配置一个SQL Server服务器是要 ...

  7. Docker容器网络配置

    Docker容器网络配置 1.Linux内核实现名称空间的创建 1.1 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令 ...

  8. docker - 容器里安装ssh

    docker安装ssh 通过命令行安装 pull ubuntu镜像 docker pull ubuntu:latest 启动并进入bash docker run -it -d ubuntu:laste ...

  9. 怎么修改无法启动的docker容器的配置?

    原因: 由于错误的配置导致原来可以启动的docker容器不能启动了.相信很多人的做法是删除容器重建一个,这样也是可以的,但是你的配置和插件就得重新安装,非常麻烦.最小的代价当然是修改原来的配置让他能启 ...

随机推荐

  1. 解决安装完Anaconda后右键没有powershell、、、

    法一: win+R 打开资源管理 输入powershell.exe 法二: 额,,按住 shift 再右键...嘿嘿嘿

  2. ANDROID开发之问题积累及解决方案(四)

    首先贴出问题类型: 程序无法启动,查看logcat,提示如下信息: W/dalvikvm(679): PR_CAPBSET_DROP 32 failed: Invalid argument. Plea ...

  3. ++i、i++、+=、-=的区别

    要分清这个区别,先要掌握赋值的顺序,赋值语句是从右往左执行的, 计算的顺序从左至右. 那么++i第一步是把自身i+1后才赋值给自身,即先加后赋值. i++第一步是先把自身赋值给自身,即先赋值后再加减. ...

  4. html data-xx 及 data()注意事项

    1.data-xx命名:xx可以包含“-”和“_”,但是不能有大写字母: 2.用$ele.data()获取值的时候,不需要“data-”前缀:$ele.data('xx'); 3.$ele.data( ...

  5. setUserData

    node.setUserData();//设置每个节点的datanode.getUserData();

  6. 如何在vivado中调用ultraedit 编辑器

    ISE下点击菜单Edit -> Preferences -> Editor. 在Editor选项框里选择Custom,在Command line syntax文本框里输入: {C:/Pro ...

  7. 2018-2019-20175334实验四《Android程序设计》实验报告

    2018-2019-20175334实验四<Android程序设计>实验报告 一.实验内容及步骤 实验四 Android程序设计-1 Android Stuidio的安装测试: 参考< ...

  8. 图解SOAPUI解析WSDL文件

    本文链接:https://blog.csdn.net/qq_16234613/article/details/53143279 新建项目 添加WSDL文件 查看方法 查看XML格式 运行测试  

  9. AcWing 803. 区间合并

    #include <iostream> #include <vector> #include <algorithm> using namespace std; ty ...

  10. Go操作influxDB

      influxDB 安装 下载 https://portal.influxdata.com/downloads/ 这里需要注意因为这个网站引用了google的api所以国内点页面的按钮是没反应的,怎 ...