使用ENTRYPOINT后Nginx访问PHP-FPM容器出现502错误的解决方法
问题根源
你的php容器ENTRYPOINT脚本最后执行/bin/bash,这会覆盖php-fpm的默认启动流程——容器启动后只会进入bash交互环境,php-fpm服务根本没启动,Nginx无法连接到php-fpm的监听端口,因此抛出502错误。
解决方案
根据你的需求,有几种不同的处理方式:
1. 保留bash交互,同时自动启动php-fpm
修改/entrypoint.sh,在启动bash前先启动前台运行的php-fpm:
#!/bin/bash # 这里可以添加你的初始化操作,比如设置文件权限、环境变量等 # 启动php-fpm(-F参数表示前台运行,不同php版本可能用--nodaemonize) php-fpm -F & # 进入bash交互 exec /bin/bash
这种方式适合需要临时进入容器调试的场景,但要注意php-fpm的前台参数需匹配你的php版本。
2. 仅做初始化,直接启动php-fpm(推荐生产环境)
如果不需要保留bash交互,让容器以php-fpm为核心进程运行,修改脚本如下:
#!/bin/bash # 执行初始化操作,例如: # chown -R www-data:www-data /var/www/html # 启动前台运行的php-fpm,作为容器的主进程 exec php-fpm -F
这样容器会持续运行php-fpm服务,Nginx能正常建立连接。
3. 用ENTRYPOINT做初始化,CMD指定启动命令(更规范的Docker实践)
调整Dockerfile的ENTRYPOINT和CMD配合使用:
ENTRYPOINT ["/entrypoint.sh"] CMD ["php-fpm", "-F"]
然后修改/entrypoint.sh,在初始化完成后执行CMD指定的命令:
#!/bin/bash # 执行你的初始化逻辑 # ... # 执行CMD传入的命令 exec "$@"
这种方式既完成了初始化,又遵循Docker的最佳实践,容器主进程是php-fpm。如果需要临时进入容器交互,用docker exec -it <php容器名称> bash即可。
验证方法
启用ENTRYPOINT后,执行以下命令查看php容器内的进程:
docker exec <php容器ID/名称> ps aux
如果看不到php-fpm相关进程,就确认是启动流程的问题。
内容的提问来源于stack exchange,提问作者DeLe
相关产品推荐
相关产品推荐

