升级PHP至8.2.x后WordPress容器curl遇getaddrinfo线程启动失败问题
问题分析与解决方案
1. IPv6监听是否是问题根源?
是的,IPv6监听配置结合PHP 8.2.x的网络线程模型变化,是导致插件更新失败和curl报错的核心原因。
PHP 8.2.x对网络栈的线程初始化逻辑做了优化,当宿主机Docker仅以IPv6监听端口时,容器内部的DNS解析线程会触发getaddrinfo() thread failed to start异常,直接导致WordPress无法连接插件仓库完成更新。而PHP 8.1.x及更低版本的网络线程模型未涉及该变化,因此不受影响。
2. 强制Docker使用IPv4监听80/443端口的方法
方法一:修改Docker全局配置(永久生效)
- 创建/编辑Docker全局配置文件
/etc/docker/daemon.json:
{ "ipv6": false, "fixed-cidr-v6": "", "default-address-pools": [ {"base": "172.17.0.0/16", "size": 24} ] }
- 重启Docker服务使配置生效:
systemctl daemon-reload systemctl restart docker
- 重新启动WordPress容器,此时
docker-proxy会自动切换为IPv4(0.0.0.0:80/0.0.0.0:443)监听端口。
方法二:容器启动时显式指定IPv4绑定(临时/单容器生效)
如果不想修改全局配置,可在启动容器时直接指定绑定IPv4地址:
docker run -d -p 0.0.0.0:80:80 -p 0.0.0.0:443:443 [你的WordPress/PHP容器参数]
若使用Docker Compose,修改docker-compose.yml的端口配置:
services: wordpress: ports: - "0.0.0.0:80:80" - "0.0.0.0:443:443" # 其他容器配置项...
启动后执行netstat -tulpn | grep LISTEN,即可确认docker-proxy已切换为IPv4监听。
3. 验证问题是否解决
容器重启后,进入容器执行DNS解析验证:
docker exec -it [容器ID/名称] curl -I google.com
若返回正常的HTTP响应头,说明网络问题已修复,此时尝试更新WordPress插件即可正常完成。
内容的提问来源于stack exchange,提问作者merilstack
相关产品推荐
相关产品推荐

