如何配置docker-compose在GitHub Actions运行带MySQL的集成测试
问题原因说明
首先纠正你的误解:同一个GitHub Actions Job下的所有run命令都运行在同一个Ubuntu Runner实例中,不会每个run启动独立实例,你遇到的连接失败和这个完全无关。
报错的核心原因通常是以下两种:
- MySQL启动存在初始化延迟:
docker-compose up执行完成后,MySQL进程虽然已经启动,但内部的权限配置、库表初始化还没完成,此时发起连接就会触发你遇到的通信丢失错误 - docker-compose端口映射配置错误:MySQL服务没有将容器内的3306端口映射到Runner宿主机的3306端口,导致本地命令无法连接
解决方案
步骤1:添加MySQL就绪等待逻辑
把你原来的MySQL连通性测试命令替换成带重试的等待脚本,给MySQL留足初始化时间:
- name: 等待MySQL启动完成 run: | for i in {1..30}; do if mysql -h 127.0.0.1 -P 3306 -u root -ppassword -e "SELECT 1" > /dev/null 2>&1; then echo "MySQL 已就绪" break fi echo "等待MySQL启动中... 第$i次重试" sleep 2 done
脚本最多重试30次,每次间隔2秒,完全覆盖MySQL的常规初始化耗时。
步骤2:确认docker-compose端口映射
检查你的docker-compose配置文件中,MySQL服务的ports配置是否为如下格式:
services: mysql: image: mysql:xxx # 你的镜像版本 ports: - "3306:3306" # 确认宿主机3306端口映射到容器3306端口 environment: MYSQL_ROOT_PASSWORD: password # 确认密码和你连接用的一致
步骤3:创建测试库
你提到不需要运行迁移,只需要创建test_db,在等待MySQL就绪的步骤后增加如下命令即可:
- name: 创建测试库test_db run: mysql -h 127.0.0.1 -P 3306 -u root -ppassword -e "CREATE DATABASE IF NOT EXISTS test_db;"
可选优化方案
如果你的应用也是通过docker-compose运行,你可以直接在docker-compose内部执行命令,无需依赖宿主机端口映射,避免端口冲突问题:
# 直接通过docker-compose exec在MySQL容器内建库,-T参数是为了适配GitHub Actions无TTY的环境 - name: 容器内创建测试库test_db run: docker-compose exec -T mysql mysql -u root -ppassword -e "CREATE DATABASE IF NOT EXISTS test_db;"
内容的提问来源于stack exchange,提问作者aRtoo
相关产品推荐
相关产品推荐

