Docker - 为Cron容器使用PHP Cli基础映像

时间:2017-11-15 21:16:21

标签: php docker cron docker-compose

所以我最近在Docker和Docker-Compose上玩得很开心,但需要社区的建议。我有一个包含以下内容的docker-compose文件:

  • Nginx容器(基于nginx:1.12-alpine图片)
  • PHP-7.0 FPM容器(基于php:7.0-fpm-alpine图像)
  • MySQL容器(基于alpine:3.6图像)

为了与Docker将进程分成单个容器的原则保持一致,我现在想添加第四个容器来运行Cron。 crontab将简单地说:

*/5 * * * * www-data sh /var/www/html/cron.sh

这适用于Magento网站,而cron通常需要不错的计算能力 - 因此我认为将它放在自己的容器中会很棒。

我有3个问题......

1)Magento的 cron.sh 运行一些检查,然后运行 cron.php ,所以我假设我的新cron容器必须有php安装并运行 - 正确吗?

2)假设我确实需要在cron容器中运行php,那么我不确定是否应该基于php:7.0-cli-alpine图像创建Dockerfile或使用替代方案?我已经读过CLI图像不能以守护进程模式运行的地方,因此这个容器可能在运行docker-compose up -d后立即退出。

3)假设我在上面的(1)和(2)中是正确的,我是否需要确保我自定义的PHP-7.0 FPM图像中安装的任何PHP / PECL扩展也安装在此新的cron图像?

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

好的,所以我在这方面取得了一些进展。我基于php:7.0-cli-alpine创建了一个新图像,这是我的Dockerfile的样子:

FROM php:7.0-cli-alpine

COPY mycrontab /mycrontab

RUN mkdir /var/log/cron
RUN touch /var/log/cron/cron.log

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

RUN /usr/bin/crontab -u www-data /crontab

CMD ["crond", "-f", "-l", "8"]

这是 mycrontab 的样子:

*/1 * * * * echo "This is a test" >> /var/log/cron/cron.log 2>&1

建造它:docker build -t test/cron:latest .

跑吧:docker run --rm -it -v /home/magz/devtest/cron/cron.log:/var/log/cron/cron.log

过了一分钟(左右),我得到了 cron.log 的预期输出:)

所以,到目前为止,这么好。我还没有使用我的Magento网站的docker-compose设置来测试这个,但我相信这会有效。

我唯一要问的问题是,是否要确保新的Cron映像具有与PHP-FPM映像相同的PHP / PECL扩展。