docker 默认不支持 crontab 计划任务,导致 Magento 批量上传产品后无法被搜索到

更新日期: 2024-07-16 阅读次数: 643 字数: 521 分类: docker

又一次被 docker 坑到。

问题现象

在 Magento 中批量上传产品信息后,新增的商品信息无法通过 Magento 的搜索功能被检索到。 猜测是批量上传功能,没有自动触发 ES 全文检索的索引功能。

手动解决方案

执行:

> bin/magento cron:run

Ran jobs by schedule.

然后,产品信息就能被搜索到了。

但是,这样操作太麻烦,总不能每次在浏览器后台上传成功之后,都去服务器上再敲一段命令行吧。

尝试通过服务器端的系统计划任务实现。

docker 中 magento 自动创建的计划任务失效

执行 magento 命令,创建计划任务:

> bin/magento cron:install

Crontab has been generated and saved

查看自动生成的 crontab 配置:

> crontab -l

#~ MAGENTO START f73db5f5dcf223372d4c9fab56bef0c1730eece898fad5cbee0c313b46b0dd1f
* * * * * /usr/local/bin/php /var/www/html/your_magento_project/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/your_magento_project/var/log/magento.cron.log
#~ MAGENTO END f73db5f5dcf223372d4c9fab56bef0c1730eece898fad5cbee0c313b46b0dd1f

但是奇怪的是,虽然是配置的每分钟执行一次,但是从日志看,并没有被执行。

而我在 docker 容器内,将复制出来的命令,手动执行,是可以看到日志记录的。

Google 了一下,发现原来大部分 Docker 镜像,默认是不支持 crontab 的,需要手动安装。

于是,我想,干脆直接使用宿主机的 crontab 得了。

在宿主机中手动测试一下命令行

> which docker
/usr/bin/docker

执行

> /usr/bin/docker compose -f /var/your_docker_compose_dir/docker-compose.yml exec phpfpm82 php --version

PHP 8.2.21 (cli) (built: Jul  6 2024 01:39:16) (NTS)

那么,实际上就可以将之前 magento 自动创建的 crontab 配置,修改一下,改成宿主机的命令调用方式即可。

宿主机的 crontab 配置

* * * * * /usr/bin/docker compose -f /var/your_docker_compose_dir/docker-compose.yml exec phpfpm82 php /var/www/html/your_magento_project/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/your_magento_project/var/log/magento.cron.log

然后查看日志文件,就能看到每分钟的执行记录了。

参考

  • https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cli/configure-cron-jobs
  • https://experienceleague.adobe.com/zh-hans/docs/commerce-operations/configuration-guide/cli/configure-cron-jobs#create-or-remove-the-magento-crontab
  • https://stackoverflow.com/questions/30905697/docker-compose-with-crontab

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式