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

maG*_*aGz 2 php cron docker 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
Run Code Online (Sandbox Code Playgroud)

这是针对 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 映像中?

谢谢你的时间!

maG*_*aGz 7

好的,所以我在这方面取得了一些进展。我创建了一个基于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"]
Run Code Online (Sandbox Code Playgroud)

这是mycrontab 的样子:

*/1 * * * * echo "This is a test" >> /var/log/cron/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)

构建它: 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 扩展。

  • 在示例中,“RUN /usr/bin/crontab -u www-data /crontab”应替换为“RUN /usr/bin/crontab -u www-data /mycrontab” (3认同)