Dockerfile如何在ENTRYPOINT中同时启动Nginx与php7.4-fpm多进程
问题结论
你当前使用的exec形式ENTRYPOINT无法直接同时启动两个进程,这种写法里所有后续参数都会作为nginx的命令参数传入,无法单独启动php-fpm。
可行解决方案
以下两种方案均可实现同时启动两个进程,优先推荐第一种:
方案1:自定义启动脚本(最稳定)
- 先在构建上下文目录新建启动脚本
start.sh,内容如下:
#!/bin/bash # 后台启动php7.4-fpm service php7.4-fpm start # 前台启动Nginx作为容器主进程,保持容器运行 nginx -g 'daemon off;'
如果service命令不可用,也可以直接调用php-fpm二进制后台启动:
/usr/sbin/php-fpm7.4 -D
- 修改Dockerfile配置,添加脚本复制、授权逻辑,替换原有ENTRYPOINT:
# 复制启动脚本到容器内 COPY start.sh /start.sh # 给脚本添加执行权限 RUN chmod +x /start.sh # 替换原有ENTRYPOINT ENTRYPOINT ["/start.sh"]
这个方案的优势是主进程为Nginx,容器可以正常接收终止信号,还可以灵活添加启动前的配置修改、权限调整等自定义逻辑。
方案2:shell形式ENTRYPOINT(快速实现)
如果你不想额外加脚本,也可以直接用shell形式的ENTRYPOINT一行实现:
ENTRYPOINT service php7.4-fpm start && nginx -g 'daemon off;'
注意这种方案的主进程是shell,会存在信号传递问题,docker stop时可能无法正常终止Nginx、php-fpm进程,仅适合测试场景临时使用。
额外注意事项
两个进程都启动后还需要确认Nginx配置的PHP转发规则和php-fpm的监听地址一致:
- 打开Nginx站点配置,找到
location ~ \.php$块 - 确认
fastcgi_pass参数的值,和/etc/php/7.4/fpm/pool.d/www.conf里的listen参数完全匹配,比如都为127.0.0.1:9000或者/run/php/php7.4-fpm.sock,否则PHP页面依然会访问失败。
内容的提问来源于stack exchange,提问作者Mully5474
相关产品推荐
相关产品推荐

