alpine镜像中check-platform-reqs报ext-mbstring missing是因apk安装后未启用扩展,需执行docker-php-ext-enable mbstring或手动在php.ini添加extension=mbstring,并用php -r "var_dump(extension_loaded('mbstring'));"验证输出bool(true)。

Alpine 镜像里 composer check-platform-reqs 报 ext-mbstring MISSING,但 php -m 确实有?
这是 Alpine 的典型“假缺失”——扩展已安装,但没被 PHP CLI 自动启用。Alpine 的 apk add php82-mbstring 只复制 so 文件到 /usr/lib/php82/modules/,不写 ini 加载项。
实操建议:
- 确认 PHP CLI 实际加载的配置:
php --ini,重点看Loaded Configuration File路径(通常是/etc/php82/php.ini) - 手动启用:在该
php.ini末尾加一行extension=mbstring(Linux/macOS)或extension=php_mbstring.dll(Windows,不适用于 Alpine) - 更推荐用官方方式:
RUN docker-php-ext-enable mbstring(Dockerfile 中),它会自动创建/etc/php82/conf.d/20-mbstring.ini - 验证是否生效:
php -r "var_dump(extension_loaded('mbstring'));"必须输出bool(true)
check-platform-reqs 显示 ext-intl MISSING,php -i | grep ICU 却有版本号?
ICU 主版本不匹配导致 intl 扩展静默失效。PHP 编译时绑定的 ICU 版本(如 72)和 Alpine 运行时提供的(如 74)不一致,intl_is_failure() 返回 true,Composer 就判为 MISSING。
实操建议:
- 查 PHP 编译用的 ICU:
php -i | grep "ICU version"(显示编译时 ICU) - 查系统 ICU:
icu-config --version或apk list | grep icu - Alpine 上必须匹配:比如 PHP 8.2 是用 ICU 72 编译的,就得装
apk add icu-data-full-72和icu-libs-72 - 别用
apk add icu—— 它默认装最新版,大概率不兼容
Docker 构建时 check-platform-reqs --no-dev 总报 ext-zip 缺失,但 apk add php82-zip 已执行?
常见于多阶段构建中:build 阶段装了 zip,但 final 阶段镜像没继承该扩展。或者 apk add 后没重启 PHP 进程(CLI 模式下其实不需要,但配置未生效)。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
实操建议:
- 在 final 阶段镜像中直接运行
php -m | grep zip,确认 zip 真存在 —— 不要只信 build 阶段日志 - 确保
apk add php82-zip和docker-php-ext-enable zip在同一层执行(避免 layer 缓存导致跳过) - 检查
php --ini输出的Scan for additional .ini files目录(如/etc/php82/conf.d/),确认20-zip.ini是否存在且内容为extension=zip -
--no-dev很关键:Alpine 最小镜像常缺 xdebug、pcntl 等 dev 扩展,加这个参数能过滤干扰项,聚焦 runtime 必需扩展
为什么 check-platform-reqs 不报 ext-openssl 缺失,但 composer install 却失败?
check-platform-reqs 只读 composer.json 的 require 字段,不扫描代码实际调用。如果项目依赖某个包(如 guzzlehttp/guzzle),而它内部用了 openssl_encrypt(),但 composer.json 没显式声明 "ext-openssl": "*",校验就完全跳过。
实操建议:
- 别依赖
check-platform-reqs覆盖全部扩展 —— 它只是静态声明检查 - 真正暴露运行时问题:在 Alpine 镜像里跑
composer install --dry-run,它会尝试加载 autoloader 并触发部分扩展调用 - Alpine 上 openssl 常被漏装:
apk add openssl(系统库) +apk add php82-openssl(PHP 扩展)都得有 - 注意大小写:
ext-openssl不能写成ext-OpenSSL,否则check-platform-reqs直接忽略该行
Alpine 环境下最易被忽略的是:扩展 so 文件存在 ≠ PHP CLI 加载成功 ≠ ICU 版本兼容 ≠ 系统库与 PHP 扩展版本对齐。光看 apk add 日志或 php -m 列表远远不够,每一步都得用 php -r 直接调用函数验证。










