Docker容器启动运行cron导致PHP脚本网页无法访问如何解决?
问题根因
php:7.2-apache基础镜像默认启动命令为启动Apache服务监听80端口,你修改后的Dockerfile的CMD指令覆盖了默认启动逻辑,仅启动了cron服务和日志监听进程,Apache服务没有运行,因此80端口无法访问。
解决方案
方案1:直接修改启动命令(最简方案)
将Dockerfile最后一行的CMD替换为以下内容,同时启动cron和Apache服务:
CMD cron && apache2-foreground
修改后重建镜像运行即可,此时cron会在后台定时执行任务,Apache前台运行提供Web访问能力,容器也不会异常退出。
如果需要同时在容器 stdout 输出cron日志,可以调整为:
CMD cron && tail -f /var/log/cron.log & apache2-foreground
方案2:使用supervisor管理多进程(生产级稳定方案)
如果需要更稳定的多进程管理,避免单进程异常退出无法感知的问题,可以通过supervisor统一管理cron和Apache两个进程:
- 安装supervisor:在Dockerfile中添加安装指令
RUN apt-get update && apt-get -y install cron supervisor
- 新增supervisor配置文件
supervisord.conf,内容如下:
[supervisord] nodaemon=true user=root logfile=/var/log/supervisord.log pidfile=/var/run/supervisord.pid [program:apache] command=apache2-foreground autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:cron] command=cron -f autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
- 复制配置文件到容器内,替换CMD为启动supervisor:
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
额外优化建议
- 不要给目录/文件设置777权限,风险极高,Apache运行需要的权限可以通过调整所属用户为
www-data实现:
RUN chown -R www-data:www-data /var/www/html && chmod -R 755 /var/www/html
- cron任务配置文件不需要执行权限,保留默认的0644权限即可,删除多余的
RUN chmod 777 /etc/cron.d/hello-cron指令。 - 可以将CLI定时执行的逻辑和Web访问的逻辑拆分到两个PHP文件中,避免CLI执行时输出无用的HTTP头信息。
内容的提问来源于stack exchange,提问作者VinoPate
相关产品推荐
相关产品推荐

