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

Github Actions+Docker Compose测试MySQL连接失败及环境变量配置求助

解决Github Actions中Docker Compose启动后数据库连接失败及环境变量配置问题

一、数据库连接失败的核心解决方案

1. 等待MySQL容器完全就绪

docker-compose up -d执行后,MySQL容器需要时间完成初始化(创建数据库、加载权限等),直接运行测试会因数据库未就绪导致连接失败。在CI环境中必须添加等待步骤,可通过以下方式实现:

- name: Wait for MySQL to be ready
  run: |
    while ! nc -z localhost 3306; do
      echo "Waiting for MySQL on port 3306..."
      sleep 2
    done

注意:需确保你的docker-compose.yml中MySQL服务已映射3306端口到主机,配置示例:ports: "3306:3306"

2. 对齐测试代码的数据库连接配置

如果测试在Github Runner主机上执行(而非容器内),测试代码中的数据库地址需设为localhost;若测试在容器内执行,需使用Docker Compose中MySQL服务的名称作为主机名(比如mysql,取决于你的docker-compose.yml服务定义)。同时要保证用户名、密码、数据库名与容器配置完全一致。

二、Github环境中配置环境变量的方法

本地.env中的敏感信息(如MySQL密码)需通过Github Secrets安全传递:

1. 添加仓库Secrets

  1. 进入你的Github仓库 → Settings → Secrets and variables → Actions
  2. 点击New repository secret,依次添加所需机密,例如:
    • DB_USER:MySQL用户名
    • DB_PASSWORD:MySQL密码
    • DB_NAME:测试用数据库名称

2. 在Actions工作流中调用Secrets

方式一:传递给Docker Compose

如果你的docker-compose.yml通过环境变量配置MySQL服务,可在启动时直接注入Secrets:

- name: Run the docker compose
  working-directory: ./project
  run: docker-compose up -d
  env:
    DB_USER: ${{ secrets.DB_USER }}
    DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    DB_NAME: ${{ secrets.DB_NAME }}

对应的docker-compose.yml服务配置示例:

services:
  mysql:
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}

方式二:传递给测试步骤

如果测试代码直接读取环境变量,在测试步骤中注入Secrets:

- name: run servers test
  working-directory: ./project/server
  run: npm test
  env:
    DB_HOST: localhost
    DB_USER: ${{ secrets.DB_USER }}
    DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    DB_NAME: ${{ secrets.DB_NAME }}

修改后的完整Github Actions配置

name: Docker Image CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: Build the Docker images 
      working-directory: ./project
      run: docker-compose build
    
    - name: Run the docker compose
      working-directory: ./project
      run: docker-compose up -d
      env:
        DB_USER: ${{ secrets.DB_USER }}
        DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
        DB_NAME: ${{ secrets.DB_NAME }}
    
    - name: Wait for MySQL to be ready
      run: |
        while ! nc -z localhost 3306; do
          echo "Waiting for MySQL on port 3306..."
          sleep 2
        done
    
    - name: install server dependencies
      working-directory: ./project/server
      run: npm ci
    
    - name: run servers test
      working-directory: ./project/server
      run: npm test
      env:
        DB_HOST: localhost
        DB_USER: ${{ secrets.DB_USER }}
        DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
        DB_NAME: ${{ secrets.DB_NAME }}
    
    - name: finish docker down
      working-directory: ./project
      run: docker-compose down

额外排查点

  • 查看MySQL容器日志:在失败步骤前添加docker-compose logs mysql命令,排查容器启动报错
  • 检查端口占用:添加netstat -tulpn | grep 3306步骤,确认Runner主机的3306端口未被占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:55:33