PhpStorm运行Docker内PHPUnit测试报数据库连接错误如何解决
问题根因
你在sp_php容器内手动执行vendor/bin/phpunit能正常跑通,说明项目代码、数据库权限、容器本身的配置都没有问题。报错核心原因是PhpStorm点击运行按钮启动PHPUnit时,拉起的PHP执行容器没有加入到docker-compose定义的internal自定义网络,容器内置的DNS无法解析同网络下MySQL的容器名sp_mysql,最终触发getaddrinfo failed的域名解析错误。
修复步骤
按优先级依次排查调整即可:
- 检查PHPUnit绑定的PHP解释器配置
打开PhpStorm设置,进入Languages & Frameworks > PHP > Test Frameworks页面,核对当前PHPUnit关联的PHP解释器:- 禁止直接选择
sp/php镜像作为独立Docker容器的解释器,这种启动方式不会加载docker-compose定义的网络、依赖服务配置,属于孤立容器,自然找不到同网络下的MySQL - 必须选择基于当前项目docker-compose创建的
php服务作为解释器,选择后PhpStorm拉起容器时会自动继承compose里配置的网络规则
- 禁止直接选择
- 手动补全容器网络配置(如果选了compose解释器仍报错)
点击右上角运行配置的下拉框,找到你当前用的PHPUnit运行项进入编辑页:- 找到Docker容器的高级设置区域
- 在
Network配置项里手动填入compose创建的网络名,默认命名规则是[你的项目根目录文件夹名]_internal,可以在终端执行docker network ls从输出列表里找到对应准确名称 - 保存配置后重新触发测试
- 配置有效性校验
调整完可以先通过PhpStorm的Docker工具窗口进入对应PHP容器的终端,执行getent hosts sp_mysql,如果能正常返回MySQL容器的IP地址,说明网络连通性已经恢复,再执行测试就不会触发连接报错。
注意:不要临时把
.env里的database_host改成127.0.0.1或者宿主机公网/局域网IP,容器内的127.0.0.1指向容器自身,除非你手动配置了host网络模式,否则这种改法不仅会让手动进容器执行phpunit的逻辑失效,还会引出新的端口映射、权限类问题。
内容的提问来源于stack exchange,提问作者Kostya
相关产品推荐
相关产品推荐

