Docker 容器内 PHP 7.2-FPM 启动失败 exit code 1 该怎么排查?

文章导读
Docker 容器内 PHP 7.2-FPM 启动失败且退出码为 1 时,最优先的操作是查看容器标准错误日志并核对 PHP 配置文件语法。该问题通常由配置错误、扩展缺失或版本不兼容导致,排查时需避免直接重启掩盖现场。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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。此外,若启动命令配置为后台运行而非前台守护,容器也会因主进程结束而停止。

Docker 容器内 PHP 7.2-FPM 启动失败 exit code 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)一致,避免权限拒绝导致启动中断。

Docker 容器内 PHP 7.2-FPM 启动失败 exit code 1 该怎么排查?

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 状态码。

Docker 容器内 PHP 7.2-FPM 启动失败 exit code 1 该怎么排查?

常见坑

  • 配置文件换行符错误: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 常见错误