如何为Docker部署的phplist配置Cron定时任务
方案1:宿主机Cron调度(推荐,无需修改镜像)
这是最简便的实现方式,直接通过宿主机的定时任务调用容器内的phpList队列处理命令即可:
- 先确认你的phpList容器名称,示例假设容器名为
phplist-app,先手动验证命令有效性:
注:如果执行报错,先执行docker exec -u www-data phplist-app php /var/www/html/admin/index.php -p processqueue -c /var/www/html/config/config.phpdocker exec -it phplist-app bash进入容器,确认phpList的安装目录、配置文件路径、运行用户,替换命令中对应参数即可。 - 验证命令正常返回无报错后,编辑宿主机crontab配置:
crontab -e - 新增定时任务规则,示例为每分钟执行一次队列处理,同时输出日志方便排查:
* * * * * docker exec -u www-data phplist-app php /var/www/html/admin/index.php -p processqueue -c /var/www/html/config/config.php > /var/log/phplist-cron.log 2>&1
方案2:容器内置Cron(适合不依赖宿主机调度的场景)
如果希望调度能力和容器绑定,不需要依赖宿主机的Cron服务,可以自定义镜像内置Cron:
- 编写Dockerfile基于官方phplist镜像扩展:
# 替换为你实际使用的phplist基础镜像名 FROM phplist/phplist:latest # 安装cron服务 RUN apt update && apt install -y cron && rm -rf /var/lib/apt/lists/* # 写入phpList定时任务配置,输出日志到容器标准输出方便通过docker logs查看 RUN echo "* * * * * www-data php /var/www/html/admin/index.php -p processqueue -c /var/www/html/config/config.php > /proc/1/fd/1 2>&1" > /etc/cron.d/phplist RUN chmod 0644 /etc/cron.d/phplist # 拷贝自定义启动脚本 COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] - 编写启动脚本
entrypoint.sh:#!/bin/bash # 后台启动cron服务 cron & # 执行原镜像的默认启动逻辑 exec "$@" - 重新构建镜像后启动容器即可。
方案3:Docker Compose 独立Cron容器(符合单进程最佳实践)
如果使用Docker Compose部署,可以新增一个独立的Cron服务,和phpList主服务共享代码、配置卷,使用相同镜像,仅启动命令改为运行cron前台进程,避免单个容器内跑多进程。
注意事项
- 执行队列命令的用户必须和phpList运行的Web用户保持一致,避免出现文件权限报错
- 配置完成后务必先手动执行一次处理命令确认无报错,再写入定时规则
- 队列执行频率可根据你的邮件发送量调整,最低间隔建议不小于1分钟
内容的提问来源于stack exchange,提问作者iappnet
相关产品推荐
相关产品推荐

