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
相关产品推荐
相关产品推荐

