如何在 php-fpm-alpine docker 容器中运行 cron 作业



嗨,我不知道如何在此容器内运行 cron 作业。

我发现这个:如何在 docker 容器内运行 cron 作业

但这覆盖了 CMD,我不知道热以保持 php-fpm 工作

当您需要在 docker 容器中运行多个进程时,解决方案是使用 supervisord 作为主指令。Docker将启动并监控主管,而主管又将启动您的其他进程。

码头工人文件示例:

FROM debian:9
...
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/my.conf"]

主管配置示例 (/etc/supervisor/my.conf):

[supervisord]
nodaemon=true
[program:cron]
command=/usr/sbin/crond -f -l 8
stdout_logfile=/dev/stdout
stderr_logfile=/dev/stderr
stdout_logfile_maxbytes=0
stderr_logfile_maxbytes=0
autorestart=true
[program:php-fpm]
command=docker-php-entrypoint php-fpm

请注意,最好将 supervisord 配置为将日志输出到/dev/stdout 和/dev/stderr,以允许 docker 处理这些日志。否则,随着文件写入量的增加,容器可能会随着时间的推移而变慢。

这里的主要问题是如何使PHP与cron"并行"工作。另一个答案,除了使用supervisor,是使用bash管理任务的能力。这里通常提到这一点.
对于Alpine PHP-FPM容器和Cron,启动脚本将如下所示:

码头工人文件:

FROM php:8.1-fpm-alpine
RUN apk --update add --no-cache bash
COPY ./crontasks /var/spool/cron/crontabs/root
COPY entrypoint.bash /usr/sbin
RUN chmod a+x /usr/sbin/entrypoint.bash
ENTRYPOINT /usr/sbin/entrypoint.bash

entrypoint.bash文件(神奇就在这里

#!/bin/bash
# turn on bash's job control
set -m
# Start the "main" PHP process and put it in the background
php-fpm &
# Start the helper crond process
crond
# now we bring the primary process back into the foreground
fg %1

重要的是要记住,Alpine 中的 cron job 语法与 Debian 不同。不同的文件夹用于任务。

最新更新