本地正常但GitLab CI中无法连接Docker部署的MySQL容器
解决GitLab CI中MySQL导入报错ERROR 2002的问题
核心原因
本地执行正常但CI中报错,主要是两个问题:
- MySQL容器尚未完全启动就绪,脚本就提前执行了导入命令
- docker-compose中healthcheck的参数格式错误,导致健康检查未生效,无法正确判断容器状态
具体修复步骤
1. 修正docker-compose.yml中的healthcheck配置
原healthcheck的mysqladmin ping参数顺序和格式错误,导致健康检查失效。修改为正确的参数格式(注意-p和密码之间无空格):
healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "symfony", "-psymfony"] timeout: 20s retries: 10
2. 在CI脚本中等待MySQL容器就绪
在docker-compose up -d之后,添加等待逻辑,确保MySQL完全启动后再执行导入:
# 等待MySQL容器健康检查通过(兼容新版docker-compose) docker-compose wait database # 或者用循环检测(兼容旧版docker-compose) until docker-compose exec -T database mysqladmin ping -h localhost -u symfony -psymfony --silent; do echo "等待MySQL启动..." sleep 2 done
3. 备选:强制使用TCP连接(绕过socket问题)
如果上述步骤仍有问题,可以修改导入命令,指定-h 127.0.0.1强制使用TCP连接,避免socket路径相关问题:
docker-compose exec -T database mysql -usymfony -psymfony -h 127.0.0.1 symfony < ci/db_dump.sql
完整CI脚本调整示例
修改后的CI脚本关键部分:
- docker-compose up -d - docker-compose logs # 等待MySQL就绪 - docker-compose wait database # 执行导入 - docker-compose exec -T database mysql -usymfony -psymfony symfony < ci/db_dump.sql
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

