workerman4容器启动后立即退出的本质是主进程(php start.php start)异常终止,因docker容器生命周期完全依赖前台主进程持续运行;需确认pcntl/posix扩展已启用、启动命令为阻塞式前台模式、disable_functions未禁用关键函数,并通过退出码(如256、139、137)精准定位php致命错误、段错误或oom问题。

Workerman4 服务在 Docker 容器内启动后容器立即退出,本质是主进程(php start.php start)异常终止,导致容器生命周期结束。这不是“进程没回收”,而是根本没起来或起完秒退——Docker 容器的存活完全依赖前台主进程是否持续运行。
检查 pcntl/posix 扩展是否真正启用
Workerman4 依赖 pcntl 和 posix 才能 fork 子进程、捕获信号、管理 worker。PHP 官方镜像(包括 8.1+ CLI)默认不启用这两个扩展,即使版本够新也必须手动安装并启用。
- Alpine 镜像:用
apk add --no-cache $PHPIZE_DEPS && pecl install pcntl && docker-php-ext-enable pcntl,再补上docker-php-ext-install posix - Debian/Ubuntu 镜像:直接
docker-php-ext-install pcntl posix - 验证命令:
docker run --rm your-image php -m | grep -E "pcntl|posix"—— 必须看到两行输出,缺一不可
确认启动命令是否为前台 CLI 模式
Workerman 是纯守护进程,不能走 FPM、Apache 或后台化(如加 &)。容器里必须以阻塞式前台命令运行:
- 错误写法:
CMD ["php-fpm"]、CMD ["php", "start.php"](漏掉start)、ENTRYPOINT ["sh", "-c", "php start.php start &"] - 正确写法(推荐):
ENTRYPOINT ["php", "start.php"]+CMD ["start"];或直接CMD ["php", "start.php", "start"] - 加
-d参数调试时,用docker run -it your-image start -d,确保start是第一个参数
排查 PHP 禁用函数和致命错误
即使扩展装了,若 disable_functions 拦住了关键函数(如 pcntl_fork、posix_kill、proc_open),master 进程会启动失败并静默退出。
- 查禁用项:
docker run --rm your-image php -i | grep disable_functions - 快速检测脚本:
curl -Ss http://www.workerman.net/check.php | php(它会明确报出缺失扩展或被禁函数) - 临时开启错误输出:在
start.php开头加三行:ini_set('display_errors', 'on'); error_reporting(E_ALL); use Workerman\Config; Config::$debug = true;
观察退出状态码定位崩溃类型
容器退出后执行 docker ps -a,看 STATUS 列末尾的 Exit(X)。常见码含义:
-
Exit(256):PHP 致命错误(如调用禁用函数、扩展段错误),查workerman.log和disable_functions -
Exit(139):SIGSEGV 段错误,大概率是 amqp/redis/opcache 等扩展 bug,需关扩展逐个验证 -
Exit(137):OOM 被系统 kill,检查容器内存限制是否过小(docker run -m 256m可能不够)











