如何在 php-fpm-alpine docker 容器中 运行 定时任务?
How to run cron jobs inside php-fpm-alpine docker container?
嗨,我不知道如何在 this 容器中 运行 一个 cron 作业。
我找到了这个:
但这会覆盖 CMD,我不知道如何让 php-fpm 正常工作
当你需要在 docker 容器中 运行 多个进程时,一个解决方案是使用 supervisord作为主要指令。 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的能力来管理任务。这个一般提到here.
对于 Alpine PHP-FPM
容器和 Cron
,启动脚本如下所示:
Docker 文件:
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 作业语法与 Debian 不同。不同的文件夹用于任务。
嗨,我不知道如何在 this 容器中 运行 一个 cron 作业。
我找到了这个:
但这会覆盖 CMD,我不知道如何让 php-fpm 正常工作
当你需要在 docker 容器中 运行 多个进程时,一个解决方案是使用 supervisord作为主要指令。 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的能力来管理任务。这个一般提到here.
对于 Alpine PHP-FPM
容器和 Cron
,启动脚本如下所示:
Docker 文件:
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 作业语法与 Debian 不同。不同的文件夹用于任务。