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
- 进入你的Github仓库 →
Settings→Secrets and variables→Actions - 点击
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
相关产品推荐
相关产品推荐

