Docker 容器内 PHP 7.2-FPM 启动失败且退出码为 1 时,最优先的操作是查看容器标准错误日志并核对 PHP 配置文件语法。该问题通常由配置错误、扩展缺失或版本不兼容导致,排查时需避免直接重启掩盖现场。
先说结论:Exit Code 1 代表通用错误,需结合日志定位是 PHP 语法错误、配置失效还是进程异常退出。
- 先确认:执行 docker logs 查看报错堆栈,使用 docker inspect 确认 State.ExitCode
- 先处理:检查 php-fpm.conf 语法,验证 PHP 版本与代码依赖是否匹配
- 再验证:手动前台运行容器观察实时输出,确认进程不再秒退
命令速用版
以下命令用于快速提取容器状态与日志信息,适用于容器已创建但处于 Exited 状态的场景。
# 查看容器退出状态与退出码
docker inspect <容器 ID> | grep -A 5 "State"
# 查看容器标准输出与错误日志
docker logs `--tail` 100 <容器 ID>
# 交互式进入容器排查(覆盖入口点)
docker run -it `--rm` `--entrypoint` sh <镜像名>
为什么会这样
退出码 1 通常表示应用程序内部错误或命令执行失败,而非 Docker 守护进程问题。
在 PHP-FPM 场景中,PID 1 进程(通常是 php-fpm)启动后立即退出,常见原因包括配置文件存在语法错误、必需的 PHP 扩展未安装、或代码依赖了当前 PHP 版本不支持的特性。例如 PHP 7.2 环境运行了需要 PHP 7.4 语法的代码,会导致解析错误并触发退出码 1。此外,若启动命令配置为后台运行而非前台守护,容器也会因主进程结束而停止。
分步处理
按顺序执行以下步骤,逐步缩小故障范围,避免盲目修改配置。
1. 确认退出码与日志
首先确认容器是否真的失败,排除正常停止干扰。执行 docker inspect 查看 State.ExitCode 字段,若为 1 则确认为异常退出。接着运行 docker logs 获取 stdout/stderr 输出,查找 Fatal error、Parse error 或 Start failed 等关键字。
2. 验证 PHP 配置语法
进入容器内部或本地挂载目录,检查 php-fpm.conf 及 pool 配置文件。使用 php-fpm -t 命令测试配置语法是否正确。若配置文件来自宿主机挂载,需确认文件权限属主与容器内运行用户(如 www-data)一致,避免权限拒绝导致启动中断。
3. 检查版本与扩展兼容性
核对 Dockerfile 基础镜像标签是否为 php:7.2-fpm,确认未误用更高版本镜像。检查代码中是否使用了 PHP 7.2 不支持的函数(如 str_starts_with 需 PHP 8.0+)。若依赖特定扩展(如 mysqli、pdo),确认镜像构建时已通过 docker-php-ext-install 安装。
4. 修正启动命令
确保 Dockerfile 中的 CMD 或 ENTRYPOINT 启动的是前台进程。PHP-FPM 需以前台模式运行(通常添加 -F 参数或配置 daemonize = no),否则主进程执行完毕容器即退出。
怎么验证是否生效
修复配置后重新构建镜像或启动容器,观察以下指标确认问题解决。
执行 docker ps 查看容器 STATUS 列是否显示 Up 而非 Exited。进入容器执行 docker top <容器 ID> 确认 php-fpm 进程存在且运行时间持续增加。若部署了 Web 服务,通过 curl 访问健康检查接口,确认返回 HTTP 200 状态码。
常见坑
- 配置文件换行符错误:Windows 编辑的配置文件若含 CRLF 换行符,在 Linux 容器内可能导致脚本无法执行,需转换为 LF 格式。
- 挂载路径覆盖: volumes 挂载可能覆盖容器内关键目录(如 /usr/local/etc/php),导致默认配置丢失。
- 架构不匹配:在 ARM 主机上运行 x86_64 镜像会触发 exec format error,需确认镜像架构与宿主机一致。
- 内存超限:若退出码为 137 而非 1,可能是 OOM Killer 终止了进程,需检查 docker stats 内存使用情况。
常见问题
Exit Code 1 和 Exit Code 137 有什么区别?
Exit Code 1 是应用层通用错误,通常由代码或配置问题引起;Exit Code 137 表示进程被系统 OOM Killer 强制杀死,通常因内存不足导致。
日志为空怎么排查?
若 docker logs 无输出,说明进程在写入日志前已崩溃。建议使用 docker run -it 交互式启动,手动执行启动命令观察实时报错。
PHP 版本不一致会影响启动吗?
会。若代码使用了高版本 PHP 特性而容器内版本过低,会导致 Fatal error 并触发退出码 1,需统一 CLI 与 FPM 版本。
参考来源
- DockerStart 解决容器启动失败的具体排查步骤
- 如何解决 DockerRun 命令启动失败并快速定位 ExitCode 报错指南
- Docker 容器 Exited 原因代码及对应故障解决方案
- PHP 过低怎样排查启动失败因_PHP 过低启动失败排查法
- 为什么你的 PHP 容器启动失败?深入剖析 Dockerfile 常见错误