通过Dockerfile创建cron作业

时间:2017-11-13 02:29:26

标签: docker cron debian

我在尝试通过Docker设置和运行一些cron作业时遇到了一些问题 - 它可能与我正在使用的基本图像有关,但我不确定并且我有点困惑这一切。

以下是我的Dockerfile的样子:

FROM wordpress:php7.1-apache

# Remove wp image cache
RUN rm -rf /usr/local/etc/php/conf.d/opcache-recommended.ini \
&& apt update \
&& apt install wget -y \
&& apt-get -y install cron

ADD ./docker/local/crontab /etc/cron.d/mycron
RUN chmod +x /etc/cron.d/mycron
RUN crontab /etc/cron.d/mycron
RUN service cron reload
RUN service cron restart

COPY ./wp-config.php /var/www/html/wp-config.php
COPY ./.htaccess /var/www/html/.htaccess
COPY ./theme /var/www/html/wp-content/themes/paper

RUN chown -R www-data:www-data /var/www

当我使用docker-compose构建此图像时,一切正常,网站运行完美。但是cron作业没有运行。如果我登录容器并输入crontab -l

它完全按照mycron文件

列出了cron作业
* * * * * root wget -O- "http://url.to/script/file.php" >> /var/log/script1.log
* * * * * root wget -O- "http://url.to/script/file2.php" >> /var/log/script2.log

但是cron的工作没有运行。并且不会创建日志文件。

但是,当我输入crontab -e并更改任何内容然后保存并退出时,请输入service cron restart

cron作业开始运行并创建日志文件。

1 个答案:

答案 0 :(得分:1)

好的,所以我通过执行以下操作来修复它 - 不知道它是否正确...

我的Dockerfile的结尾看起来像这样..

ADD ./docker/local/mycron /etc/cron.d/mycron
COPY ./docker/local/all.env /root/all.env

ADD ./docker-entrypoint.sh /usr/local/bin/init.sh
RUN chmod +x /usr/local/bin/init.sh
ENTRYPOINT ["init.sh"]
CMD ["apache2-foreground"]

然后,在(docker-entrypoint.sh文件)的顶部 - 现在是init.sh

chmod +x /etc/cron.d/mycron
crontab /etc/cron.d/mycron
service cron reload
service cron restart
chmod +x /var/www/html/path.to.cron.sh

使用cron文件看起来像

0,30 * * * * /var/www/html/path.to.cron.sh

如果你的环境变量存在问题,那是因为crontab是在不同的环境下执行的,所以你需要通过传入一个环境var文件来执行cron,通过一个句点来表示,'用'。

执行
0,30 * * * * . /root/all.env; /var/www/html/path.to.script.php

确保您设置正确的时区,不仅在小时主机服务器上,而且在容器内也是如此。

它可能稍微过于复杂,但是,它对我有用。如果您有任何疑问,请告诉我。