You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TeamCity流水线内PHP容器无法连接MySQL容器问题求助

排查思路整理

1. 验证MySQL容器状态与网络连通性

  • 在TeamCity流水线中添加步骤,执行docker-compose ps,确认MySQL容器处于Up状态,无异常退出记录。
  • 在PHP容器内测试与MySQL服务的连通性:
    • 执行docker exec teamcity-php-fpm ping mysql(mysql为docker-compose.yml中MySQL服务的名称),检查是否能正常解析并收到响应,若ping不通则说明容器网络存在隔离问题。
    • 执行docker exec teamcity-php-fpm telnet mysql 3306,验证3306端口是否可正常连接,排除端口未监听的情况。

2. 核对Laravel环境变量配置

  • 在TeamCity中添加步骤打印.env文件内容:cat .env,重点检查以下参数:
    • DB_HOST必须是docker-compose.yml中MySQL服务的名称(如mysql),不能是localhost或127.0.0.1(容器内的localhost指向自身,而非MySQL容器)。
    • 确认DB_PORT=3306、DB_DATABASE、DB_USERNAME、DB_PASSWORD与本地测试配置完全一致,避免.env.teamcity存在笔误。

3. 确认MySQL容器初始化完成

  • MySQL容器启动后需时间完成初始化(如创建数据库、加载权限表),本地测试可能手动等待了就绪状态,但TeamCity流水线会自动连续执行步骤,导致迁移命令过早执行。
  • 解决方法:在执行migrate前添加等待逻辑,例如使用wait-for-it脚本(需提前放入PHP容器):
    docker exec teamcity-php-fpm ./wait-for-it.sh mysql:3306 -t 60
    
  • 查看MySQL容器日志排查初始化错误:docker logs <mysql-container-name>,检查是否有数据库创建失败、权限配置错误等信息。

4. 排查TeamCity Agent的Docker环境差异

  • 对比本地与TeamCity Agent的Docker、docker-compose版本,部分旧版本compose的网络配置存在兼容性问题,可能导致容器无法互通。
  • 若TeamCity Agent本身运行在Docker容器内,需确认Agent的网络模式允许子容器(PHP/MySQL)在同一网络内通信,避免Agent的网络隔离策略影响子容器网络。
  • 检查docker-compose.yml中的自定义网络配置,确认所有服务都加入了同一网络,且TeamCity环境中docker-compose up时正确创建了该网络。

5. 检查服务器层面的网络限制

  • 确认TeamCity所在服务器的防火墙/iptables规则未阻止容器内部的3306端口通信,虽Docker默认允许容器互通,但特殊安全配置可能拦截流量。

内容的提问来源于stack exchange,提问作者killstreet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:25:10