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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:51:03