Webman用docker-compose up -d启动失败主因是PHP镜像缺失pcntl/posix扩展,导致start.php无法守护运行;须定制Dockerfile安装扩展、执行composer install、设runtime权限、固定CMD命令。
Webman 项目直接用
启动失败,八成是 PHP 扩展缺失或镜像没装
/
—— 这两个扩展不是可选项,是 Webman 常驻运行的硬性门槛。
为什么官方
docker
-compose.yml 启动后立刻退出?
根本原因:容器内 PHP 缺少
或
扩展,导致
无法进入守护进程模式,执行完就退出。这不是配置问题,是镜像构建缺陷。
用
进入容器验证(
)
官方预置的
默认基于
,但该镜像不自带
/
,必须显式安装
Alpine 镜像需用
+
组合;Debian/Ubuntu 镜像用
+
Windows 用户若用 WSL2 外的 Docker Desktop,别依赖宿主机 PHP 环境 —— 容器内环境完全独立
如何改写 Dockerfile 保证 Webman 稳定常驻?
不能直接复用通用 PHP 镜像,必须定制化构建。关键动作是「装扩展 → 清依赖 → 设权限 → 固命令」。
基础镜像选
(非
,Webman 不走 FPM)
必须执行:
(顺序无关,但缺一不可)
要在容器内执行,而非宿主机;否则
权限或架构可能错乱
,否则日志、session、cache 写入失败,
启动时静默报错
入口命令固定为:
,别加
包裹,会干扰信号传递
docker-compose.yml 里哪些配置动不得?
端口映射、健康检查、卷挂载这三项一旦配错,服务就不可达或状态误判。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
是默认约定,改端口可以,但必须同步改
中的
必须用
,不能用
或其他路径 —— Webman 默认只在
暴露健康端点
只挂载代码目录(如
),别挂载整个宿主机
—— 容器内
必须可写,挂载粒度太粗会导致权限冲突
别加
在开发环境 —— 启动失败时无限重启会掩盖真实错误,先确保单次启动成功再加
Windows 下访问不到 8787 端口?查三件事
Docker Desktop 的网络模型和 Linux 不同,127.0.0.1 不等于容器 localhost。
先确认容器 IP:
,看到的是类似
的内网地址
宿主机浏览器不能输
,得输
(Docker Desktop 自动做了端口转发)
如果仍打不开,检查 Windows 防火墙是否拦截了 8787 端口 —— Docker Desktop 不自动放行自定义端口
别用
网络模式,它在 Windows 上行为不稳定,
是唯一可靠选择
最易被忽略的是
目录权限和
扩展的编译完整性 —— 它们不出错不报错,但会让 Webman 表现为“启动即消失”,连日志都不留一行。
docker compose up -dpcntlposixpcntlposixstart.php start -dphp -m | grep -E "pcntl|posix"docker compose exec webman shdocker-compose.ymlphp:8.2-clipcntlposixapk adddocker-php-ext-installapt installdocker-php-ext-installphp:8.2-cli-fpmdocker-php-ext-install pcntl posixcomposer install --no-dev --optimize-autoloadervendor/RUN chmod -R 777 /app/runtimestart.phpCMD ["php", "/app/start.php", "start", "-d"]sh -cports: ["8787:8787"]config/server.php'port' => 8787healthcheckcurl -f http://localhost:8787/ping//pingvolumes./:/app/var/www/app/runtimerestart: alwaysdocker inspect | grep IPAddress 172.19.0.2http://127.0.0.1:8787http://localhost:8787hostbridgeruntime/pcntl