1. 安装 cron
在 Dockerfile 中添加安装 cron 的命令
RUN apt-get install cron -y
2. bash 文件支持
在 Dockerfile 所在的目录新建 crontab 文件,没有 .sh 文件后缀,内容为
#!/usr/bin/env bash
* * * * * /usr/local/bin/php /var/www/html/artisan schedule:run >> /dev/null 2>&1
/usr/local/bin/php 是 docker 中的 php 所在路径,不知道的可以进到 docker 容器中利用 which php 命令获取到.
/var/www/html 是项目路径
在 Dockerfile 中将 crontab 文件映射到容器中.并赋予读写权限
COPY ./crontab /var/spool/cron/crontabs/root
RUN chmod 0644 /var/spool/cron/crontabs/root
RUN crontab /var/spool/cron/crontabs/root
在 Dockerfile 文件所在的目录中新建 entrypoint bash 文件,添加运行 cron 的脚本
#!/bin/bash
set -e
cron
exec "$@"
由于项目有其他的需要,所以 bash 脚本可能大同小异
利用 ENTRYPOINT 命令添加 entrypoint.bash 脚本到 Dockerfile 中.
我的完整的 Dockerfile 文件如下
FROM php:7.1.8-apache
ENV TZ=Asia/Shanghai
ENV APACHE_LOG_DIR /var/log/apache2_log
COPY sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
libpq-dev \
g++ \
libicu-dev \
libxml2-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install mbstring \
&& docker-php-ext-install zip \
&& docker-php-ext-install pdo pdo_mysql mysqli opcache pcntl \
&& pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& a2enmod rewrite \
&& cron \
&& vim
RUN a2enmod ssl
### 队列
COPY ./crontab /var/spool/cron/crontabs/root
RUN chmod 0644 /var/spool/cron/crontabs/root
RUN crontab /var/spool/cron/crontabs/root
COPY ./entrypoint.sh /usr/local/bin/
CMD ["entrypoint.sh"]
3. 重新 build 容器
进入容器观察 cron 是否成功
参考
https://laravel-china.org/articles/7022/using-laravel-schedule-in-docker